2017-06-14 1 views
2

Ich habe ein Geschäft mit bag und favorites. Momentan gibt es eine Aktion zu REMOVE_FROM_BAG. Dies löst einen Nebeneffekt aus, um den Artikel aus Ihrer Tasche aus der API zu entfernen, der REMOVE_FROM_BAG_COMPLETE auslöst, der ihn tatsächlich aus dem Geschäft entfernt.Ketteneffekte mit Abhängigkeit vom Ergebnis anderer Effekte

Wir fügen eine Aktion hinzu, MOVE_FROM_BAG_TO_FAVORITES, die einen Artikel aus bag entfernen und in favorites einfügen wird. Wenn der Remove-API-Aufruf fehlschlägt, sollte nichts weiter fortgesetzt werden. Der Gesamtablauf wäre:

MOVE_BAG_TO_FAVORITES 
REMOVE_FROM_BAG 
@Effect Api Call 
REMOVE_FROM_BAG_COMPLETE 
ADD_TO_FAVORITES 

Wenn also der API-Aufruf fehlschlägt, sollte das Element nicht aus dem Beutel zu speichern oder zu Ihrer Favoriten-Liste entfernt werden.

// REMOVE_FROM_BAG side effect; API call; success removes item from the store 
@Effect() 
removeFromBag = this.actions$ 
    .ofType(REMOVE_FROM_BAG) 
    .switchMap(({ payload }) => this.bagService.remove(payload) 
    .map(() => ({ type: REMOVE_FROM_BAG_COMPLETE, payload }) 
    .catch(() => of({type: REMOVE_FROM_BAG_FAIL })) 
); 

Wie für den Artikel zu den Favoriten zu bewegen, ich kann es REMOVE_FROM_BAG als Nebenwirkung auslösen als gut, aber ich bin nicht sicher, wie Sie sicherstellen, wenn die Nebenwirkung erfolgreich ist oder nicht (das heißt, es Kette).

@Effect() 
moveFromBagToFavorites = this.actions$ 
    .ofType(MOVE_FROM_BAG_TO_FAVORITES) 
    .mergeMap(({ payload }) => [ 
    { type: REMOVE_FROM_BAG, payload }, 
    { type: ADD_TO_FAVORITES, payload }, 
    ]); 

In der Theorie sollte diese Arbeit, aber ich bin nicht sicher, wie ADD_TO_FAVORITES zu verhindern, dass im Fall versandt wird REMOVE_FROM_BAG schlägt fehl, da der API-Aufruf fehlgeschlagen ist. Gibt es eine bessere Möglichkeit, Aktionen mit Nebenwirkungen zu verketten?

Antwort

3

Die unreinen Effektanrufe sind wahrscheinlicher, als Ihre reinen Anrufe zu reduzieren.

So würde ich Ihre Wirkung Anruf zuerst ausgeführt werden müssen:

@Effect Api Call -- Effect 
API_CALL_COMPLETE -- Redux (should change state) 
    MOVE_BAG_TO_FAVORITES -- Redux 
    REMOVE_FROM_BAG -- Redux 
    REMOVE_FROM_BAG_COMPLETE -- Not necessary anymore 
    ADD_TO_FAVORITES -- Redux 

Wenn der API-Aufruf fehlschlägt, ist kein Rollback erforderlich.

+0

Das würde in Ordnung funktionieren, aber dann müsste ich zwei separate Aktionen erstellen, um die remove API aufzurufen. Ich versuche, dies zu vermeiden und den vorhandenen Remove-Effekt zu verwenden, um die API aufzurufen, sodass sie nur an einer Stelle ausgeführt wird. –

+2

Wenn die beiden Aufrufe die gleichen sind, aber unterschiedliche Auswirkungen haben, würde ich daraus zwei Effektaktionen mit unterschiedlichen Typ-IDs erstellen. Ja, es ist doppelt vorhanden, aber es wird aus verschiedenen Kontexten mit verschiedenen Nebenwirkungen aufgerufen. Ich denke, es ist definitiv klarer. – pixelbits

Verwandte Themen