4

以下示例取自@ngrx 示例

我这样理解这个可观察的。第一个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)))
    );
4

1 回答 1

5

尽管@cartant 添加了第一个答案,但答案和评论很难理解。这是我如何解释此代码的方法。

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

效果addBookToCollection$。_

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

我们可以使用switchMapormergeMap来转换Observable<Book>to Observable<action>。这两个都将高阶可观察对象转换为一阶,如下所示:

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

switchMap对于将发出最新的内部 observable 并且可以由 @ngrx 订阅的异步操作是有益的。但是mergeMap用于让所有内部的 observables 通过并发。因此它将允许用户选择的所有书籍从this.db.insert. 本质上,mergeMap外部可观察对象中获取并与内部可观察map对象合并以生成新的一阶可观察对象。this.db.insert

mergeMap获取bookaction.payload来自上一个)并将其map传递给this.db.insert. 将通过typethis.db.insert生成一个动作。的将其返回给并且 的返回第一个订单。collection.AddBookSuccessAction(book)Observable<Action>mapthis.db.insertmergeMapmergeMapObservable<Action>

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

于 2017-04-02T17:04:42.123 回答