Nous avons une action qui récupère un objet de manière asynchrone, appelons-la getPostDetails
qui prend en paramètre le poste à récupérer par un identifiant. L'utilisateur se voit présenter une liste de messages et peut cliquer sur l'un d'eux pour obtenir des détails.
Si un utilisateur clique sur "Post #1", nous envoyons un GET_POST
qui pourrait ressembler à quelque chose comme ceci.
const getPostDetails = (id) => ({
type: c.GET_POST_DETAILS,
promise: (http) => http.get(`http://example.com/posts/#${id}`),
returnKey: 'facebookData'
})
Cette information est récupérée par un intergiciel, qui ajoute un gestionnaire de succès à la promesse, qui appellera une action telle que GET_POST__OK
avec l'objet JSON désérialisé. Le reducer voit cet objet et l'applique à un magasin. Un exemple typique __OK
Le réducteur ressemble à ceci.
[c.GET_ALL__OK]: (state, response) => assign(state, {
currentPost: response.postDetails
})
Plus tard, nous avons un composant qui examine currentPost
et affiche les détails du poste actuel.
Cependant, nous avons une condition de course. Si un utilisateur soumet deux GET_POST_DETAILS
actions l'une après l'autre, il n'y a aucune pas de garantie sur l'ordre dans lequel nous recevons les __OK
dans, si la deuxième requête http se termine avant la première, la deviendra incorrect.
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
Comment faire en sorte que le dernier élément sur lequel l'utilisateur a cliqué soit toujours prioritaire ?