Abbiamo un'azione che recupera un oggetto asincrono, chiamiamolo getPostDetails
, che accetta un parametro di cui post per recuperare un id. . L'utente viene presentato con un elenco di post e può fare clic su uno per ottenere alcuni dettagli.Come evitare le condizioni di gara durante il recupero dei dati con Redux?
Se un utente fa clic su "Post # 1", inviamo un'azione GET_POST
che potrebbe essere simile a questa.
const getPostDetails = (id) => ({
type: c.GET_POST_DETAILS,
promise: (http) => http.get(`http://example.com/posts/#${id}`),
returnKey: 'facebookData'
})
Questo viene prelevato da un middleware, che aggiunge un gestore successo alla promessa, che chiamerà un'azione come GET_POST__OK
con l'oggetto JSON deserializzato. Il riduttore vede questo oggetto e lo applica a un negozio. Un tipico riduttore __OK
si presenta così.
[c.GET_ALL__OK]: (state, response) => assign(state, {
currentPost: response.postDetails
})
tardi giù la linea abbiamo un componente che guarda currentPost
e visualizza i dettagli per il post corrente.
Tuttavia, abbiamo una condizione di gara. Se un utente invia due azioni GET_POST_DETAILS
l'una dopo l'altra, c'è non è garantito quale ordine riceveremo le azioni __OK
in, se la seconda richiesta HTTP termina prima del primo, lo stato diventa errato.
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
Come possiamo essere sicuri che l'ultimo elemento su cui l'utente ha fatto clic abbia sempre la priorità?
Ho una situazione leggermente diversa. Cosa devo fare se ho anche 'currentPostId' e' postById', ma devo recuperare i dati su tutti i messaggi al momento (tempo quando creato, immagine di anteprima, meta, ecc.) E quindi recuperare il contenuto di un solo post selezionato e cache questo contenuto con tutto il resto su questo post in 'postById'? – denysdovhan
@DanAbramov Ciao, so che questa è una domanda piuttosto vecchia, ma poiché nessun creatore di azioni non ha accesso allo stato, come può il creatore dell'azione decidere se è stato memorizzato nella cache o ha bisogno di recuperare l'oggetto remoto? – Vinz243
Cosa succede se si ha 'currentListOfSearchResults' che è un array, invece di un solo' currentPost'? Di solito finisco per saltare Redux per questi risultati e semplicemente inserirli nello stato locale per il mio componente di pagina. –