从效果中调度多个动作:不同 rxjs 运算符之间的区别
Dispatch multiple actions from effects: difference between different rxjs operators
一旦 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,任何正在进行的请求都将被取消。
在调度多个动作方面,以下所有工作:
- return [action1, action2]
- return 来自([action1, action2])
- return of(action1, action2)
以下无效:
- return of([action1, action2]) --> Effect "UserEffects.loadUser" 调度了一个无效的动作:[object Object],[object Object]
前三个选项有什么区别? http请求后mergeMap vs switchMap怎么样?为什么最后一个选项不起作用?
这个问题可以分为几个部分:
+) mergeMap和switchMap的区别:
mergeMap = 地图 + mergeAll。它将数据流映射到可观察流,每次内部可观察值发出一个值时,外部将收集所有发出的值并将其合并到一个新流中。
switchMap,非常相似,但正如你所知道的那样 "switches",即如果下一个内部可观察对象发出一个新值,则前一个被取消(一个内部可观察对象一次可观察)。
+) mergeMap 和 switchMap 的相似之处:它们都可以将任何类似流的对象转换为可观察对象。
+) 你的代码区别:
return [action1, action2] 确实使 switchMap(() => ...) 类似于 from([action1, action2]),即从数组.
return from([action1, action2]),这是一个发出 2 个动作的内部 observable,switchMap 将这些动作合并回它的流。
return of(action1, action2) = from([action1, action2])
然而,return of([action1, action2]) 创建了一个发出单个值的 observable,它是一个数组,你不能调用 store.dispatch( array_of_actions)
一旦 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,任何正在进行的请求都将被取消。
在调度多个动作方面,以下所有工作:
- return [action1, action2]
- return 来自([action1, action2])
- return of(action1, action2)
以下无效:
- return of([action1, action2]) --> Effect "UserEffects.loadUser" 调度了一个无效的动作:[object Object],[object Object]
前三个选项有什么区别? http请求后mergeMap vs switchMap怎么样?为什么最后一个选项不起作用?
这个问题可以分为几个部分:
+) mergeMap和switchMap的区别:
mergeMap = 地图 + mergeAll。它将数据流映射到可观察流,每次内部可观察值发出一个值时,外部将收集所有发出的值并将其合并到一个新流中。
switchMap,非常相似,但正如你所知道的那样 "switches",即如果下一个内部可观察对象发出一个新值,则前一个被取消(一个内部可观察对象一次可观察)。
+) mergeMap 和 switchMap 的相似之处:它们都可以将任何类似流的对象转换为可观察对象。
+) 你的代码区别:
return [action1, action2] 确实使 switchMap(() => ...) 类似于 from([action1, action2]),即从数组.
return from([action1, action2]),这是一个发出 2 个动作的内部 observable,switchMap 将这些动作合并回它的流。
return of(action1, action2) = from([action1, action2])
然而,return of([action1, action2]) 创建了一个发出单个值的 observable,它是一个数组,你不能调用 store.dispatch( array_of_actions)