useReducer возвращает обещание вместо обновленного состояния - PullRequest
0 голосов
/ 17 апреля 2020

Мой редуктор:

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;
    }
};

Мое приложение. 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;

Что происходит в приложении. js, после вызова второго useEffect, обновляет состояние и пользователь возвращает обещание. Обещание имеет несколько свойств, в одном из которых находится правильное состояние, которое оно должно было вернуть. Разве это не должно вернуть государство? Я что-то не так делаю?

В двух словах:

1) Приложение запускается

2) useEffect вызывает первый раз и имеет правильное начальное состояние

3) Я вызываю действие LOAD, которое обновит состояние

4) useEffect вызывается во второй раз. На этот раз он возвращает обещание и должен возвращать только обновленное состояние магазина, я полагаю?

Console

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Похоже, что функция, которую вы передаете useReducer, равна async. Все функции async возвращают обещание. Вам потребуется await или использовать синтаксис .then, чтобы получить значение из обещания. Это не обещание с первого раза, потому что оно возвращает исходное состояние. Надеюсь, это поможет!

1 голос
/ 17 апреля 2020

Возвращает обещание, потому что редуктор является асинхронной c функцией, и это из-за ожидаемого вызова AsyncStorage:

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

. Вы должны переместить выборку хранилища в ловушку эффекта. и затем dispatch результат разрешенного / отклоненного обещания.

Другая причина для перемещения извлечения данных заключается в том, что редукторы должны быть чистыми функциями (это ссылка на документы Redux, но идея все еще применима к редукторам React). Единственным источником данных, который должен иметь редуктор, являются его параметры state и action. Это позволяет определить поведение c по отношению к этим параметрам; при одинаковых аргументах отдельные вызовы редуктора всегда должны возвращать один и тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...