Будет ли 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'.