getState (). свойство возвращает неопределенное значение внутри асинхронной функции - PullRequest
1 голос
/ 09 апреля 2019

Я использую react-thunk с redux для реализации функции входа в систему, но когда я получаю доступ к состоянию с помощью getState(), свойство возвращает неопределенное значение.

SystemState установит IsLoginedи user когда LoginSuccessed, я буду использовать его позже для токена доступа.Но когда я пытаюсь реализовать функцию выхода из системы, getState().Property возвращает неопределенное

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() не должен вызываться внутри асинхронной функции?

--- edit ---

Редуктор для SystemSate

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

const rootReducer = combineReducers({
    systemState
});

1 Ответ

0 голосов
/ 10 апреля 2019

Проблема в том, что вы неправильно истолковываете структуру государства.

Вы определили свой корневой редуктор как:

const rootReducer = combineReducers({
    systemState
});

Редуктор systemState, в свою очередь, имеет начальное состояние:

const initState = {    
    isLogined: false
}

Эти две вещи определяют структуру того, что возвращается getState(), что на самом деле будет:

{
    systemState : {
        isLogined : true
    }
}

Обратите внимание, что это означает, что вам нужно state.systemState.isLogined, а не state.isLogined.

Итак, в вашем случае вы, вероятно, хотите:

const state = getState();
const {isLogined} = state.systemState;
...