Является store.dispatch в Redux синхронным или асинхронным

104

Я понимаю, что это основной вопрос, но мне не удалось найти ответ в другом месте.

Является ли store.dispatchсинхронный или асинхронный в Redux?

Если это асинхронно, есть ли возможность добавить обратный вызов после того, как действие было распространено, как это возможно с помощью React?

ps-aux
источник
Обратите внимание, что состояние обновляется синхронно ( getState()), но mapStateToPropsне обновляется . То this.props.valueже самое старое значение, а getState().valueновое - codeandbox.io/s/reactredux-forked-0m5eo?file=/Page.js
Mosh Feu

Ответы:

89

AFAIK, диспетчерское действие синхронно. В случае, если вы хотите обратиться к асинхронному вызову, вы можете использовать промежуточное программное обеспечение thunk в redux, где отправка предоставляется как функция обратного вызова, которую вы можете вызывать по своему усмотрению. Для получения дополнительной информации ознакомьтесь с этим ответом на SO от самого автора: Как отправить действие Redux с таймаутом?

agpt
источник
69

Никто не знает лучше, чем сам код . =) Как видите dispatchабсолютно синхронно. Единственное предупреждение здесь заключается в том, что store enhancersможет (и делает) заменяющий dispatchметод. Например, взгляните на applyMiddlewareEnhancer , он позволяет вам подключать промежуточное ПО, заменяя dispatchметод по умолчанию его собственной реализацией. Хотя я никогда не видел Redux, enhancerкоторый бы действительно удалил синхронный характер файлов dispatch.

фкуликов
источник
1
Вы должны обновить ссылку на промежуточное ПО на https://github.com/reduxjs/redux/blob/master/src/applyMiddleware.ts#L19 (из-за переноса redux с js -> ts, я не могу внести изменения так как это <6 символов). Или, возможно, вам следует сослаться на фиксацию, когда они все еще использовали js, как в вашей code itselfссылке, что было бы мертвыми ссылками из-за аспекта коммитов «постоянная ссылка».
user7413060