У нас есть действие, которое извлекает объект async, назовем его getPostDetails
, который принимает параметр, из которого post для извлечения
id. Пользователь получает список сообщений и может нажать на один, чтобы получить некоторые сведения.
Если пользователь нажимает "Сообщение № 1", мы отправляем действие GET_POST
, которое может выглядеть примерно так.
const getPostDetails = (id) => ({
type: c.GET_POST_DETAILS,
promise: (http) => http.get(`http://example.com/posts/#${id}`),
returnKey: 'facebookData'
})
Это подхватывается промежуточным программным обеспечением, которое добавляет обработчик успеха к обещанию, которое вызовет действие, подобное
GET_POST__OK
с десериализованным объектом JSON. Редуктор видит этот объект и применяет его к магазину. Типичный
__OK
редуктор выглядит следующим образом.
[c.GET_ALL__OK]: (state, response) => assign(state, {
currentPost: response.postDetails
})
Позже вниз по линии у нас есть компонент, который смотрит на currentPost
и отображает детали для текущего сообщения.
Однако у нас есть условие гонки. Если пользователь отправляет два действия GET_POST_DETAILS
один за другим, есть
нет гарантии того, в каком порядке мы получаем действия __OK
, если второй HTTP-запрос заканчивается до первого,
состояние станет неправильным.
Action => Result
---------------------------------------------------------------------------------
|T| User Clicks Post #1 => GET_POST for #1 dispatched => Http Request #1 pending
|i| User Clicks Post #2 => GET_POST for #2 dispatched => Http Request #2 pending
|m| Http Request #2 Resolves => Results for #2 added to state
|e| Http Request #1 Resolves => Results for #1 added to state
V
Как мы можем убедиться, что последний элемент, который пользователь нажал, всегда будет приоритетным?