http请求成功后,我需要从ngrx效果中调度多个操作。
似乎有几种方法可行,有些没有,我不明白有什么区别。
@Effect()
loadUser = this.actions
.pipe(
ofType(campaignActions.type.LOAD_CAMPAIGN),
map((action: userActions.LoadUserAction) => action.payload),
switchMap((payload: { id: number }) =>
this.s.getUser(payload.id)
.pipe(
switchMap((data) => {
return from([
new userActions.LoadUserSuccessAction(),
new userActions.SomethingElseSuccessAction()
]);
}),
catchError(() => of(new userActions.LoadUserFailureAction()))
)
)
);
首先,我可以使用switchMap或mergeMap。我相信不同之处在于,如果多次触发此效果,那么如果我使用switchMap,而没有使用mergeMap,则所有正在进行的请求都将被取消。
在分派多个动作方面,以下所有工作:
以下内容无效:
前三个选项之间有什么区别? http请求之后,mergeMap和switchMap怎么样?为什么最后一个选项不起作用?
答案 0 :(得分:4)
这个问题可以分为几个部分:
+)mergeMap和switchMap之间的区别:
mergeMap =映射+ mergeAll。它将数据流映射到可观察流,每当内部可观察对象发出一个值时,外部观察对象将收集所有发出的值并将其合并到新流中。
switchMap,非常相似,但是正如您可以告诉它“切换”一样,即,如果下一个内部可观测值发出新值,则前一个值将被取消(一次一个内部可观测值)。
+)mergeMap和switchMap之间的相似之处:它们都可以将任何类似于流的对象转换为可观察对象。
+)您的代码之间的区别:
return [action1,action2]确实确实使switchMap(()=> ...)类似于from([action1,action2]),即从数组中创建一个可观察对象。
从([action1,action2])返回,这是一个内部可观察对象,它发出2个动作,而switchMap将这些动作合并回到其流中。
(action1,action2)的返回= from([[action1,action2]))
返回([action1,action2])会创建一个可观察的对象,该对象发出一个值,该值是一个数组,您不能调用store.dispatch(array_of_actions)