Будет ли getState всегда возвращать последнее состояние после вызова диспетчеризации?

Если у меня есть такой код,

    dispatch({
        type: actionTypes.ABCD,
        ...newInfo,
    });
    const state = getState();

Могу ли я положиться на 100% state быть последним государством? Или dispatch асинхронный и у меня нет гарантии на то, обновилось ли состояние?

1 ответ

Да. Вызов dispatch()само по себе на 100% синхронно. Тем временем dispatch() возвращает, корневой редуктор был запущен, значение состояния было обновлено, и все подписчики были уведомлены. Так что да, звонок в getState() незамедлительно после dispatch() вернет последнее значение.

Предостережение в том, что любое промежуточное программное обеспечение может перехватывать, задерживать или изменять отправленное действие. Таким образом, окончательный ответ зависит от того, какое промежуточное программное обеспечение установлено и как оно настроено.

getState() действительно извлекает последнее значение, но если вы не изменяете свое состояние (которым вы не должны быть, например, с библиотекой Immer), вы должны быть осторожны, если вы установите его в переменную 'state' внутри вашего создатель действия.

Например:

let state = getState();
dispatch({
    type: actionTypes.someStateChange,
    newInfo1: newInfo
});
dispatch({
    type: actionTypes.someOtherAction,
    infoDependentOnNewInfo1: state.newInfo1.property
});

Это не будет работать должным образом, потому что состояние, как определено выше, будет иметь старое состояние, так как первая диспетчеризация создала новое неизменяемое состояние, на которое не ссылается переменная 'state'.

Другие вопросы по тегам