useReducer返回承诺而不是更新状态

时间:2020-04-16 23:16:38

标签: javascript reactjs react-hooks use-reducer

我的减速器:

=SOMME(F2:INDIRECT("F"&LIGNE(F2)+K2-1))

我的App.js:

export const initialUserState = {
    username: '',
    address: '',
    token: '',
    address: '',
    loggedIn: false,
    loaded: false,
};

export const userReducer = async (state, action) => {
    try {
        switch (action.type) {
            case 'LOAD':
                try {
                    const value = JSON.parse(await AsyncStorage.getItem('user_info'));
                    const newState = { ...state, ...value, loggedIn: true, loaded: true };
                    console.log('New State:', newState);

                    if (value !== null) {
                        return newState;
                    }
                } catch (error) {
                    return { ...state, loaded: true };
                }
                break;
            default:
                return state;
        }
    } catch (error) {
        console.log(error);
        return state;
    }
};

在App.js中发生的情况是,在调用第二个useEffect之后,状态会更新,并且 user 返回一个promise。 Promise具有多个属性,其中之一是应返回的正确状态。它不应该返回状态吗?我在做错什么吗?

简而言之:

1)应用启动

2)useEffect首次调用并具有正确的初始状态

3)我调用LOAD操作,它将更新状态

4)useEffect被第二次调用。这次,它返回一个promise,并且应该只返回商店的更新状态?

Console

2 个答案:

答案 0 :(得分:3)

您传递给useReducer的函数似乎是async。所有async函数都返回一个诺言。您可能需要await或使用.then语法才能从promise中获得价值。这不是第一次承诺,因为它返回了初始状态。希望有帮助!

答案 1 :(得分:1)

它返回一个promise,因为减速器是异步函数,这是因为等待调用AsyncStorage

const value = JSON.parse(await AsyncStorage.getItem('user_info'));

您应该将获取的存储移到一个效果挂钩中,然后dispatch将已解决/已拒绝的诺言的结果。

移出数据的另一个原因是reducer应该是pure functions(这是Redux文档的链接,但是这个想法仍然适用于React reducer)。精简器应具有的唯一数据源是其stateaction参数。这样就可以针对这些参数进行确定性行为。给定相同的参数,单独的reducer调用应始终返回相同的结果。