在这个@ngrx示例中,mergeMap有什么好处?

时间:2017-04-01 22:58:35

标签: ngrx ngrx-effects

以下示例取自@ngrx example

我理解这种可观察的方式。第一个map函数获取payload这是要添加的书,再由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)))
    );

1 个答案:

答案 0 :(得分:4)

虽然@cartant添加了第一个答案,但答案和评论很难理解。以下是我可以解释此代码的方法。

原始代码中,this.actions$始发可观察。第一个map创建的可观察对象是外部可观察内部可观察是由this.db.insert创建的可观察对象。因此这里有3个可观察者。

效果addBookToCollection$

此代码(原始代码)的目的是生成类型为addBookToCollection$的{​​{1}}可观察对象。第一个Observable<action>将创建map。这种类型不是效果,所以根本不能以第一个Observable<Book>结束。此map需要转换为Observable<Book>

我们可以使用Observable<Action>switchMapmergeMap转换为Observable<Book>。这两个都将高阶可观察量转换为如下的第一个顺序:

Observable<action>

Observable<Observable<Book> ----> Observable<Action>对于异步操作是有益的,其中将发出最新的内部可观察量并且可以由@ngrx订阅。但switchMap用于让所有内部可观察对象同时进行。因此,它将允许用户选择的所有书籍从mergeMap生成可观察量。从本质上讲,this.db.insertmergeMap获取外部可观察,并与map中的内部可观察合并,以生成新的第一个订单可观察。

this.db.insert获取mergeMap(前一个book的{​​{1}})并将其传递给action.payloadmap会通过this.db.insert类型this.db.insert生成一个操作。 collection.AddBookSuccessAction(book)的{​​{1}}会向Observable<Action>返回mapthis.db.insert会返回第一个订单mergeMap

mergeMap有什么问题?修改后的代码仅使用Observable<Action>,它返回类型为Modified Code的高阶可观察对象。这不是正确类型的效果map,其类型应为Observable<Observable<AddBookSuccessAction>>>