Асинхронный Redux
2. Асинхронные действия
Redux не предоставляет функционала для отправки асинхронных действий, эту задачу решают прослойки. Есть много готовых решений: для простых асинхронных операций подойдет redux-promise
, для средней сложности redux-thunk
, а для очень сложных и запутанных redux-saga
или redux-observable
.
Для начала необходимо научиться писать асинхронные action creators
. Это функции которые вместо объекта-действия возвращают функцию. В компьютерных науках это называется thunk
.
Когда action creator
возвращает функцию, эта функция будет выполняться прослойкой. Такая функция не должна быть чистой, поэтому она может иметь побочные эффекты, в том числе выполнение асинхронных HTTP-запросов. В ее теле также могут быть отправлены другие сихронные действия.
2.1. thunk middleware
Напишем прослойку thunk
, которая умеет обрабатывать асинхронные действия. Если действие это функция, она будет вызвана и аргументами ей будут переданы dispatch
и getState
, тем самым позволяя использовать dispatch
в теле действия. В противном случае, если это обычный объект, действие будет отправлено дальше по цепочке прослоек.
2.2. HTTP-запросы
При асинхроннах операциях зачастую необходимо отображать лоадеры и обрабатывать ошибки. В таких случаях можно использовать следующую схему действий.
Начальное состояние может выглядеть так, с полями флага загрузки и хранения ошибки.
Тогда асинхронное действие может выглядеть так.
При
notes/FETCH_START
в полеloading
записываетсяtrue
, а приnotes/FETCH_SUCCESS
илиnotes/FETCH_FAILURE
наоборотfalse
При
notes/FETCH_FAILURE
в полеerror
записывается объект ошибкиПри
notes/FETCH_SUCCESS
в полеitems
записываются данные
2.3. Дополнительные материалы
Last updated
Was this helpful?