以下示例取自@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)
虽然@cartant 添加了第一个答案,但答案和评论很难理解。这是我如何解释这段代码。
在原始代码中,this.actions$是原始 observable。第一个创建的 observablemap是外部 observable。所述内可观察到的是通过创建的可观察到的this.db.insert。因此这里有 3 个 observables。
该效果是addBookToCollection$。
这段代码(原始代码)的目的是生成一个addBookToCollection$observable 类型Observable<action>。第一个map将创建一个Observable<Book>. 这种类型不是效果,所以根本不能以第一个map. 这Observable<Book>需要转换为Observable<Action>.
我们可以使用switchMap或mergeMap将 转换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。
该mergeMap取book(action.payload从以前的map),并把它传递给this.db.insert。this.db.insert将通过collection.AddBookSuccessAction(book)类型生成一个动作Observable<Action>。的map的this.db.insert回报是在mergeMap与mergeMap回报的一阶Observable<Action>。
有什么问题Modified Code?修改后的代码只使用map返回一个高阶 observable 类型的Observable<Observable<AddBookSuccessAction>>>。这不是正确类型的效果addBookToCollection$,应该是类型Observable<Action>。
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |