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

相关问题