首页 > 解决方案 > getState() 在几秒钟后更改已调度操作的值

问题描述

var signedIn = useSelector(signedInState);
function handle(){
      dispatch(signInUser(username.value, password.value))
      console.log(signedIn,store.getState().Auth.signedIn)

      setTimeout(() => {
        console.log(signedIn,store.getState().Auth.signedIn)
        if(signedIn){
          console.log("push")
          history.push("/")
        }
      }, 2000)
      
    } 

此函数在 onclick 后执行到组件中,当调度操作时,我有 2 个控制台日志,一个带有选择器,一个带有 getState(),我收到 2 个不同的结果:

第一个控制台日志是: null null

第二个控制台日志是: null tr​​ue //getState 在 2 秒后捕获正确的状态

为什么选择器和 getState 函数在 setTimeout 之后收到不同的结果?为什么在第一个 console.log 中选择器和 getState 没有得到新值?

//动作导出函数signInUser(用户名,密码){

return async dispatch =>{
    
    const {
        SIGN_IN_USER_SUCCESS,
        SIGN_IN_USER_FAIL,
    } = AuthKeys;

    var returning;

    var authenticationData = {
        Username: username,
        Password: password,
    };
    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);

    var poolData = {
        UserPoolId: settings.UserPoolId,
        ClientId: settings.ClientId,
    };
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    var userData = {
        Username: username,
        Pool: userPool,
    };
     var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess:function (result) {
            console.log("access token + " + result.getAccessToken().getJwtToken());
            dispatch({
                type: SIGN_IN_USER_SUCCESS,
                payload: cognitoUser,
            });
            return true
        },

        onFailure:function (err) {
            dispatch({
                type: SIGN_IN_USER_FAIL,
                payload: cognitoUser,
            });
            alert(err.message);
            return false
        },
    });
};
}

// 减速器

const initialState = {
    signedIn        : null,
    signedInUser    : null,
}
export default (state = initialState, action) => {
    const {
        //Requests
        SIGN_IN_USER_SUCCESS,
        SIGN_IN_USER_FAIL,
    } = AuthKeys;

    switch(action.type){
        
        case SIGN_IN_USER_SUCCESS:
            return { ...state,
                signInEmailData     : initialState.signInEmailData,
                signInPasswordData  : initialState.signInPasswordData,
                signedIn            : true,
                signedInUser        : action.payload}
        case SIGN_OUT_USER_SUCCESS:
            return {
                ...state,
                signedIn        : false,
                signedInUser    : INITIAL_STATE.signedInUser, 
            }
        case SIGN_IN_USER_FAIL:
            return { ...state,
                    signInPasswordData  : INITIAL_STATE.signInPasswordData, 
                    signedIn            : false 
                };
    }
//selector
export const  signedInState=(state)=>state.Auth.signedIn

标签: javascriptreactjsreduxreact-redux

解决方案


推荐阅读