Wir haben eine Aktion, die ein Objekt asynchron abruft, nennen wir es getPostDetails
, die einen Parameter von welchem Post abholt, um eine ID. Dem Benutzer wird eine Liste mit Posts angezeigt, auf die Sie klicken können, um einige Details zu erhalten.Wie vermeidet man die Bedingungen beim Abrufen von Daten mit Redux?
Wenn ein Benutzer auf "Post # 1" klickt, versenden wir eine GET_POST
Aktion, die in etwa so aussieht.
const getPostDetails = (id) => ({
type: c.GET_POST_DETAILS,
promise: (http) => http.get(`http://example.com/posts/#${id}`),
returnKey: 'facebookData'
})
Dies wird durch eine Middleware aufgenommen, die einen Erfolg Handler das Versprechen fügt hinzu, die eine Aktion wie GET_POST__OK
mit dem entserialisierten JSON-Objekt aufruft. Der Reduzierer sieht dieses Objekt und wendet es auf ein Geschäft an. Ein typischer __OK
Reducer sieht so aus.
[c.GET_ALL__OK]: (state, response) => assign(state, {
currentPost: response.postDetails
})
später auf der ganzen Linie haben wir eine Komponente, die bei currentPost
und zeigt die Details für die aktuelle Post sieht.
Wir haben jedoch eine Race-Bedingung. Wenn ein Benutzer zwei GET_POST_DETAILS
Aktionen hintereinander einsendet, gibt es keine Garantie, welche Reihenfolge wir erhalten die __OK
Aktionen in, wenn die zweite HTTP-Anfrage vor der ersten endet, wird der -Status falsch werden.
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
Wie können wir sicherstellen, dass das letzte Element, auf das der Benutzer geklickt hat, immer Vorrang hat?
Ich habe ein bisschen andere Situation. Was soll ich tun, wenn ich auch 'currentPostId' und' postById' habe, aber ich muss Daten über alle Beiträge abrufen (Zeitpunkt der Erstellung, Vorschaubild, Meta usw.) und dann den Inhalt von nur einem ausgewählten Beitrag abrufen und Cache diesen Inhalt mit allem anderen über diesen Beitrag in 'postById'? – denysdovhan
@DanAbramov Hallo Ich weiß, dass dies eine ziemlich alte Frage ist, aber da jeder Aktionsersteller keinen Zugriff auf den Status erhält, wie kann der Aktionsersteller entscheiden, ob er zwischengespeichert wurde oder ob er das entfernte Objekt holen muss? – Vinz243
Was ist, wenn Sie 'currentListOfSearchResults' haben, welches ein Array ist, anstatt nur 'currentPost'? Normalerweise überspringe ich Redux für diese Ergebnisse und setze sie nur in den lokalen Zustand für meine Seitenkomponente. –