以下示例取自@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)))
);
答案 0 :(得分:4)
虽然@cartant添加了第一个答案,但答案和评论很难理解。以下是我可以解释此代码的方法。
在原始代码中,this.actions$
是始发可观察。第一个map
创建的可观察对象是外部可观察。 内部可观察是由this.db.insert
创建的可观察对象。因此这里有3个可观察者。
效果为addBookToCollection$
。
此代码(原始代码)的目的是生成类型为addBookToCollection$
的{{1}}可观察对象。第一个Observable<action>
将创建map
。这种类型不是效果,所以根本不能以第一个Observable<Book>
结束。此map
需要转换为Observable<Book>
。
我们可以使用Observable<Action>
或switchMap
将mergeMap
转换为Observable<Book>
。这两个都将高阶可观察量转换为如下的第一个顺序:
Observable<action>
Observable<Observable<Book> ----> Observable<Action>
对于异步操作是有益的,其中将发出最新的内部可观察量并且可以由@ngrx订阅。但switchMap
用于让所有内部可观察对象同时进行。因此,它将允许用户选择的所有书籍从mergeMap
生成可观察量。从本质上讲,this.db.insert
从mergeMap
获取外部可观察,并与map
中的内部可观察合并,以生成新的第一个订单可观察。
this.db.insert
获取mergeMap
(前一个book
的{{1}})并将其传递给action.payload
。 map
会通过this.db.insert
类型this.db.insert
生成一个操作。 collection.AddBookSuccessAction(book)
的{{1}}会向Observable<Action>
返回map
,this.db.insert
会返回第一个订单mergeMap
。
mergeMap
有什么问题?修改后的代码仅使用Observable<Action>
,它返回类型为Modified Code
的高阶可观察对象。这不是正确类型的效果map
,其类型应为Observable<Observable<AddBookSuccessAction>>>
。