2017-04-01 6 views
2

Das folgende Beispiel stammt aus der @ngrx example.Welchen Vorteil hat die MergeMap in diesem @ ngrx-Beispiel?

Ich verstehe dieses Observable auf diese Weise. Die erste map Funktion erhält die payload, die das Buch hinzugefügt wird, wieder von der mergeMap verarbeitet, wo es in der Datenbank speichert.

Originalcode:

@Effect() 
    addBookToCollection$: Observable<Action> = this.actions$ 
    .ofType(collection.ActionTypes.ADD_BOOK) 
    .map((action: collection.AddBookAction) => action.payload) 
    .mergeMap(book => 
     this.db.insert('books', [ book ]) 
     .map(() => new collection.AddBookSuccessAction(book)) 
     .catch(() => of(new collection.AddBookFailAction(book))) 
    ); 

Kann der folgende Code das gleiche tun wie die oben? Warum ist ein mergeMap erforderlich?

Modified Code:

@Effect() 
    addBookToCollection$: Observable<Action> = this.actions$ 
    .ofType(collection.ActionTypes.ADD_BOOK) 
    .map((action: collection.AddBookAction) => 
     this.db.insert('books', [ action.payload ]) 
     .map(() => new collection.AddBookSuccessAction(action.payload)) 
     .catch(() => of(new collection.AddBookFailAction(action.payload))) 
    ); 

Antwort

3

Obwohl @cartant die erste Antwort hinzugefügt, die Antwort sowie Kommentare sind schwer zu verstehen. Hier ist, wie ich diesen Code erklären kann.

Im Urcode, this.actions$ ist der Ursprung beobachtbaren. Das Observable, das von der ersten map erstellt wurde, ist die äußere beobachtbare. Die innere beobachtbare ist die Observable erstellt von this.db.insert. Somit gibt es hier 3 Observables.

Der Effekt ist addBookToCollection$.

Der Zweck dieses Codes (Urcode) ist eine beobachtbare addBookToCollection$ vom Typ Observable<action> zu erzeugen. Die erste map wird eine Observable<Book> erstellen. Dieser Typ ist nicht, was der Effekt ist, so einfach kann nicht mit dem ersten map enden. Diese Observable<Book> muss in Observable<Action> konvertiert werden.

Wir können switchMap oder mergeMap verwenden, um die Observable<Book> zu Observable<action> zu konvertieren. Beide wandeln einen hohen Auftrag beobachtbar erste Ordnung wie folgt:

Observable<Observable<Book> ----> Observable<Action>

Die switchMap ist vorteilhaft für die Asynchron-Operationen, bei denen die letzten inneren beobachtbaren emittiert werden und dass durch @ngrx abonniert werden. Aber mergeMap wird verwendet, um alle inneren Observablen gleichzeitig passieren zu lassen. So wird es allen vom Benutzer ausgewählten Büchern ermöglichen, Observables von this.db.insert zu erzeugen. Im Wesentlichen nimmt die mergeMap die äußere beobachtbare von map und verschmilzt mit der inneren beobachtbaren von this.db.insert, um eine neue beobachtbare erste Ordnung zu erzeugen.

Die mergeMap nimmt die book (action.payload aus den vorherigen map) und an this.db.insert passieren. this.db.insert erzeugt eine Aktion über collection.AddBookSuccessAction(book) vom Typ Observable<Action>.Die map von this.db.insert gibt diese an die mergeMap zurück und die mergeMap gibt eine erste Bestellung Observable<Action> zurück.

Was ist los mit der Modified Code? Der modifizierte Code verwendet nur map, der eine beobachtbare höhere Ordnung des Typs Observable<Observable<AddBookSuccessAction>>> zurückgibt. Dies ist nicht der korrekte Effekttyp addBookToCollection$, der vom Typ Observable<Action> sein sollte.

Verwandte Themen