首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异步函数内,getState().property返回未定义

在异步函数内,getState().property返回未定义
EN

Stack Overflow用户
提问于 2019-04-09 18:24:47
回答 1查看 1.2K关注 0票数 1

我使用带有reduxreact-thunk来实现登录功能,但是当我使用getState()访问状态时,该属性返回未定义。

SystemState会将IsLogineduser设置为LoginSuccessed,稍后我会将其用于访问令牌。但是当我尝试实现注销函数时,getState().Property返回undefined

代码语言:javascript
复制
function logout() : ThunkAction<void, SystemState, null, Action<string>> {
    return async (dispatch, getState) => {
        const { user, isLogined } = getState();

        console.log(`user: ${user} isLogined:${isLogined}` )
        // Console writes user: undefined isLogined: undefined

        if (!isLogined) {
            dispatch(actions.LogoutFailed("No login Session Found"));
        } else if (user) {
            const result = await services.Logout(user.UserId);

            if (result.errorMessage) {
                dispatch(actions.LogoutFailed(result.errorMessage));
            } else {
                dispatch(actions.Logout());
            }
        }
    }
}

getState()不应该在异步函数内部调用吗?

-编辑

SystemSate的减速机

代码语言:javascript
复制
const initState = {    
    isLogined: false
}

function SystemStateReducer(state = initState, action) {
    switch(action.type) {
        case types.LOGIN_SUCCESS:            
            return {
                ...state,
                isLogined: true, 
                user: action.user, 
                errorMessage: undefined
            }
        case types.LOGIN_FAILED:
            return {
                ...state, 
                isLogined: false, 
                user: undefined, 
                errorMessage: action.errorMessage
            }
        case types.LOGOUT_SUCCESS:
            return {
                ...state,
                isLogined: false, 
                user: undefined, 
                errorMessage: undefined
            }
        case types.LOGOUT_FAILED:
            return {
                ...state,                 
                isLogined: false, 
                user: undefined,
                errorMessage: action.errorMessage
            }
        default:
            return state;
    }
}

CombineReducer

代码语言:javascript
复制
const rootReducer = combineReducers({
    systemState
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-10 16:45:27

问题是你曲解了国家结构是什么。

您已经将根缩减程序定义为:

代码语言:javascript
复制
const rootReducer = combineReducers({
    systemState
});

反过来,systemState reducer的初始状态为:

代码语言:javascript
复制
const initState = {    
    isLogined: false
}

这两件事定义了getState()返回的内容的结构,实际上是:

代码语言:javascript
复制
{
    systemState : {
        isLogined : true
    }
}

请注意,这意味着您需要state.systemState.isLogined,而不是state.isLogined

因此,在您的情况下,您可能需要的是:

代码语言:javascript
复制
const state = getState();
const {isLogined} = state.systemState;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55590596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档