2017-04-01 10 views
2

次の例は、@ngrx exampleです。この@ngrxの例のmergeMapのメリットは何ですか?

私はこれをこのように観察することができます。最初のmap関数は、追加する書籍である​​を取得し、再びデータベースに保存するmergeMapによって処理されます。

オリジナルコード:

@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))) 
    ); 

次のコードは、上記のように同じことを行うことができますか? mergeMapが必要な理由

修正コード:@cartantは最初の答えを追加しましたが、

@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))) 
    ); 

答えて

3

は、答えだけでなく、コメントを理解するのは難しいです。このコードを説明する方法は次のとおりです。 オリジナルコード

this.actions$は観察発信あります。最初のmapによって作成された観察可能なものは、外側の観察可能なです。 内側に観察可能なは、this.db.insertによって作成された観察可能なものです。したがって、ここに3つの観測値があります。

効果addBookToCollection$です。

このコード(オリジナルコード)の目的は、タイプObservable<action>addBookToCollection$観察を生成することです。最初のmapObservable<Book>を作成します。このタイプは効果がないので、最初はmapで終わることはできません。このObservable<Book>Observable<Action>に変換する必要があります。

switchMapまたはmergeMapを使用してObservable<Book>Observable<action>に変換できます。これらの両方は以下のように一次に観察高次変換:

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

switchMap最新内観察が放出され、それは@ngrxが加入することができる非同期動作のために有益です。しかし、mergeMapは、すべての内部観測値が同時に並行するようにするために使用されます。したがって、ユーザが選択したすべての書籍にthis.db.insertからのオブザーバブルを生成させることができます。本質的には、mergeMapの外側を観測可能なからmapへと移動させ、内側の観測可能なからthis.db.insertに合併して、新しい1次観測値を生成します。

mergeMap(前mapaction.payloadから)bookを受け取り、this.db.insertに渡します。 this.db.insertは、Observable<Action>collection.AddBookSuccessAction(book)でアクションを生成します。mapthis.db.insertの場合はmergeMapに戻り、mergeMapの場合はObservable<Action>が返されます。

Modified Codeの何か問題がありますか?変更されたコードでは、mapのみを使用し、Observable<Observable<AddBookSuccessAction>>>の上位の観測可能なものを返します。これは、タイプObservable<Action>でなければならない正しいタイプの効果addBookToCollection$ではありません。

関連する問題