2017-04-01 51 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

修改代碼:

@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

雖然@cartant添加的第一個答案,答案以及評論是很難理解。以下是我可以如何解釋這段代碼。

原代碼this.actions$始發觀察到。由第一個map創建的可觀察點是外部可觀察點內部可觀察到的是由this.db.insert創建的可觀察值。因此,這裏有3個可觀察的事物。

效果addBookToCollection$

此代碼的用途(原始代碼)是生成類型爲Observable<action>addBookToCollection$可觀察值。第一個map將創建一個Observable<Book>。這種類型不是什麼效果,所以根本不能以第一個map結束。這Observable<Book>需要轉換爲Observable<Action>

我們可以使用switchMapmergeMapObservable<Book>轉換爲Observable<action>。這兩個轉換高階可觀察到一階象下面這樣:

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

switchMap是其中最新的內部觀察到的將被髮射,並且可以通過@ngrx訂閱異步操作是有益的。但mergeMap被用來讓所有內部的可觀察者都經歷併發。所以它將允許用戶選擇的所有書籍從this.db.insert生成觀察值。本質上,mergeMapmap獲得外部可觀測的並與內部可觀測的合併從this.db.insert生成新的一階可觀測。

mergeMap(來自之前的mapaction.payload)開出book並將它傳遞給this.db.insertthis.db.insert將通過類型Observable<Action>collection.AddBookSuccessAction(book)生成一個操作。mapthis.db.insert將其返回到mergeMap,並且mergeMap返回第一個訂單Observable<Action>

Modified Code怎麼了?修改後的代碼僅使用map,它返回Observable<Observable<AddBookSuccessAction>>>類型的高階可觀察值。這不是addBookToCollection$的正確類型,其類型應該是Observable<Action>

相關問題