Использование хуков вместо Redux с асин c действиями - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь реализовать собственное хранилище, в котором вместо перехвата используются перехватчики для выполнения действий входа и проверки токена очевидная проблема заключается в том, что когда я пытаюсь обновить глобальное состояние, обновление выполняется до разрешения обещания.

, вот как я его реализовал:

import {useState,useEffect}from 'react'
let globalState:any ;
let listners: any[] = [];
let actions :any ;

export const useStore = async (shouldListen = true) =>{
    const setState =  useState(globalState)[1];
     const dispatch = (actionIdentifier:any,payload:any) =>{
     const newState =  actions[actionIdentifier](globalState,payload);
     globalState = {...globalState,...newState};
     for (const listner of listners){
         listner(globalState);
     }
   };
   //when the componnet uses this store the listener will be pushed
   //and removed on cleanup(unmount)
   useEffect(()=>{
       if(shouldListen){
            listners.push(setState);
       }
        return () => {
       if(shouldListen){

            listners = listners.filter((listener:any) => listener!== setState);
       }
        }
   },[setState,shouldListen]);
return [globalState,dispatch];
};
export const initStore = (userActions:any,initialState:any) =>{
    if(initialState){
        globalState = {...globalState,...initialState};     
    }
    actions = {...actions,...userActions};
}

и это пример действия при входе в систему:

import {initStore} from './store';
const authStore = () =>{
const actions = {
    LOGIN: (curState:any,payload:any) =>{  
      let results = await axios.post('http://localhost:3000/users/login',payload,
        {
            headers:{
            Authorization:payload.token
            } 
        })
        return {...curState,...results} 
        },
};
initStore(actions,{
    isAuthonticated:false,
    user:{
        name:'',
        email:''},
    value:0,
    token:''
});
}
export default authStore;

теперь результаты являются обещанием, также пытался использовать then / catch и получил те же результаты. Есть ли способ обновить глобальное состояние после разрешения обещания, а затем вернуть его?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...