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

won*_*rld 4 ngrx ngrx-effects

以下示例取自@ngrx 示例

我以这种方式理解这个 observable。第一个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)))
    );
Run Code Online (Sandbox Code Playgroud)

下面的代码可以做和上面一样的事情吗?为什么有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)))
    );
Run Code Online (Sandbox Code Playgroud)

won*_*rld 5

虽然@cartant 添加了第一个答案,但答案和评论很难理解。这是我如何解释这段代码。

原始代码中this.actions$原始 observable。第一个创建的 observablemap外部 observable。所述内可观察到的是通过创建的可观察到的this.db.insert。因此这里有 3 个 observables。

效果addBookToCollection$

这段代码(原始代码)的目的是生成一个addBookToCollection$observable 类型Observable<action>。第一个map将创建一个Observable<Book>. 这种类型不是效果,所以根本不能以第一个map. 这Observable<Book>需要转换为Observable<Action>.

我们可以使用switchMapmergeMap将 转换Observable<Book>Observable<action>。这两种方法都将高阶 observable 转换为一阶,如下所示:

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

switchMap有利于异步操作,其中最新的内部 observable 将被发出并且可以被@ngrx 订阅。但是mergeMap用于让所有内部 observables 作为并发进行。因此它将允许用户选择的所有书籍从this.db.insert. 本质上,themergeMap外部 observable frommap内部 observable from合并this.db.insert以生成新的一阶 observable。

mergeMapbookaction.payload从以前的map),并把它传递给this.db.insertthis.db.insert将通过collection.AddBookSuccessAction(book)类型生成一个动作Observable<Action>。的mapthis.db.insert回报是在mergeMapmergeMap回报的一阶Observable<Action>

有什么问题Modified Code?修改后的代码只使用map返回一个高阶 observable 类型的Observable<Observable<AddBookSuccessAction>>>。这不是正确类型的效果addBookToCollection$,应该是类型Observable<Action>