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

Javascript useReducer返回承诺而不是更新状态,javascript,reactjs,react-hooks,use-reducer,Javascript,Reactjs,React Hooks,Use Reducer,我的减速机: export const initialUserState = { username: '', address: '', token: '', address: '', loggedIn: false, loaded: false, }; export const userReducer = async (state, action) => { try { switch (action.type) {

我的减速机:

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:

import { userReducer, initialUserState } from './reducer';

const App = () => {
    const [user, dispatch] = useReducer(userReducer, initialUserState);

    useEffect(() => {
        dispatch({ type: 'LOAD', ready: setReady });
    }, []);

    useEffect(() => {
        console.log('state user:', user);
    }, [user]);
}

export default App;
在App.js中,调用第二个useffect后,状态更新,并且用户返回一个承诺。承诺有多个属性,其中一个属性是它应该返回的正确状态。它不应该返回状态吗?我做错什么了吗

简言之:

1) 应用程序启动

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

3) 我调用加载操作来更新状态

4) 第二次调用useffect。这次它返回一个承诺,我想它应该只返回商店的更新状态


看起来您传递给
useReducer
的函数是
async
。所有
async
函数都返回一个承诺。您需要等待或使用。然后语法从承诺中获取值。它不是第一次通过的承诺,因为它返回初始状态。希望有帮助

它返回一个承诺,因为reducer是一个异步函数,这是因为等待调用
AsyncStorage

const value = JSON.parse(await AsyncStorage.getItem('user_info'));
您应该将存储回迁移到一个effect钩子中,然后
dispatch
解析/拒绝承诺的结果


将数据取出的另一个原因是还原器应该是(这是指向Redux文档的链接,但这个想法仍然适用于React还原器)。减速器应具有的唯一数据源是其
状态
动作
参数。这就允许关于这些参数的确定性行为;给定相同的参数,单独的reducer调用应始终返回相同的结果。

您将使用redux thunk进行异步操作,并将请求移动到操作创建者,所以这个问题是关于React hook的“reducer”而不是redux,对吗?你能把redux thunk和react挂钩一起使用吗?谢谢,我试过了,没有返回承诺,而是返回未定义的,我不知道为什么。正如@bsapaka提到的,我将逻辑从减速器内部移动到外部,并将数据作为有效负载传递。它工作了,但现在我无法访问其他组件中的减速器,它总是返回初始状态。我要搬到Redux去。我不需要任何复杂的东西,但我厌倦了浪费时间。谢谢,我做到了,我将逻辑从减速器内部移动到外部,并将数据作为有效负载传递。它工作了,但现在我无法访问其他组件中的减速器,它总是返回初始状态。我要搬到Redux去。我不需要任何复杂的东西,但我已经厌倦了浪费时间。如果您需要其他组件中的状态,请将reducer向上移动,直到所有需要数据的组件都位于具有reducer的组件下