繁体   English   中英

从效果中调度多个动作:不同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]
  • 从([action1,action2])返回
  • 返回(action1,action2)

以下不起作用:

  • return([action1,action2]) - >效果“UserEffects.loadUser”调度无效动作:[object Object],[object Object]

所有前3个选项有什么区别? 在http请求之后mergeMap与switchMap怎么样? 为什么最后一个选项不起作用?

这个问题可以分为几个部分:

+)mergeMap和switchMap之间的区别:

  • mergeMap = map + mergeAll。 它将数据流映射到可观察流,并且每次内部observable发出值时,外部将收集所有发出的值并将其合并到新流中。

  • switchMap ,非常相似,但正如你可以告诉它“开关”,即如果下一个内部observable发出一个新值,前一个被取消(一次内部可观察)。

+)mergeMap和switchMap之间的相似性:它们都可以将任何类似流的对象转换为可观察对象。

+)您的代码之间的差异:

  • return [action1,action2]确实使switchMap(()=> ...)类似于from([action1,action2]),即从数组创建一个observable。

  • 从([action1,action2])返回,这是一个内部observable,它发出2个动作,switchMap将这些动作合并回它的流。

  • 从([action1,action2])返回(action1,action2)=

  • 但是,返回([action1,action2])会创建一个发出单个值的observable,这是一个数组,你不能调用store.dispatch(array_of_actions)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM