从效果中分派多个动作:不同rxjs运算符之间的差异

bub*_*ble 5 effects rxjs ngrx angular

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()))
                    )
            )
        );
Run Code Online (Sandbox Code Playgroud)

首先,我可以使用switchMap或mergeMap。我相信不同之处在于,如果多次触发此效果,那么如果我使用switchMap,而没有使用mergeMap,则所有正在进行的请求都将被取消。

在分派多个动作方面,以下所有工作:

  • 返回[action1,action2]
  • 从([action1,action2])返回
  • 返回(动作1,动作2)

以下内容不起作用:

  • 返回[[action1,action2])->效果“ UserEffects.loadUser”调度了无效的操作:[对象对象],[对象对象]

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

Ngo*_*yen 5

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

+) mergeMap 和 switchMap 的区别:

  • 合并地图 = 地图 + 合并所有。它将数据流映射到 observable 流,每次内部 observable 发出一个值时,外部 observable 将收集所有发出的值并将其合并到一个新的流中。

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

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

+) 您的代码之间的区别:

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

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

  • return of(action1, action2) = from([action1, action2])

  • 然而, return of([action1, action2]) 会创建一个发出单个值的 observable,该值是一个数组,并且您不能调用 store.dispatch(array_of_actions)