Я пытаюсь реализовать собственное хранилище, в котором вместо перехвата используются перехватчики для выполнения действий входа и проверки токена очевидная проблема заключается в том, что когда я пытаюсь обновить глобальное состояние, обновление выполняется до разрешения обещания.
, вот как я его реализовал:
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 и получил те же результаты. Есть ли способ обновить глобальное состояние после разрешения обещания, а затем вернуть его?
Спасибо