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,则任何正在进行的请求都将被取消。

在分派(dispatch)多个 Action 方面,以下所有工作:
  • 返回[action1,action2]
  • 返回(([action1,action2]))
  • 返回(action1,action2)

  • 以下内容不起作用:
  • 返回([[action1,action2]))->效果“UserEffects.loadUser”调度了一个无效的 Action :[object Object],[object Object]

  • 前三个选项之间有什么区别? http请求后,mergeMap和switchMap怎么样?为什么最后一个选项不起作用?

    最佳答案

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

    +)mergeMap和switchMap之间的区别:

  • mergeMap = map + mergeAll。它将数据流映射到可观察流,并且每次内部可观察对象发出值时,外部观察对象将收集所有发出的值并将其合并到新流中。
  • switchMap,非常相似,但是正如您可以告诉它“切换”一样,即,如果下一个内部可观测值发出新值,则前一个将被取消(一次一个内部可观测值)。

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

    +)您的代码之间的区别:
  • return [action1,action2]实际上确实使switchMap(()=> ...)类似于from([action1,action2]),即从数组中创建一个可观察对象。
  • 从([action1,action2])返回,这是一个内部可观察的对象,它发出2个 Action ,而switchMap将这些 Action 合并回到其流中。
  • 返回(action1,action2)= from([[action1,action2]))
  • 返回([[action1,action2]))会创建一个可观察的对象,该对象发出单个值,该值是一个数组,您不能调用store.dispatch(array_of_actions)
  • 10-07 14:35