当不在Epics中的SwitchMap / MergeMap中时,forkJoin的行为是什么?

时间:2019-06-01 01:50:07

标签: rxjs redux-observable

我想了解当我直接通过管道传递给action $并尝试使用forkJoin运算符时会发生什么情况

const action1 = { type: "ACTION_1" };
const action2 = { type: "ACTION_2" };

在switchMap forkJoin中工作正常。



export const testForkJoinSwitchMap: Epic<Action> = action$ =>
  action$.pipe(
    ofType(action1),
    switchMap(() =>
      forkJoin(
        from(fetch("https://api.github.com/users")).pipe(
          map((res: any) => {
            return res;
          })
        )
      )
    ),
    map((data: any) => {
      // do something with data
      return action2;
    })
  );

如果我从switchMap中取出它,则:


export const testForkJoin: Epic<Action> = action$ =>
  action$.pipe(
    ofType(action1),
    forkJoin(from(fetch("https://api.github.com/users"))).pipe(
      map((response: any) => {
        return action2;
      })
    )
  );

输入错误:

Argument of type 'Observable<{ type: string; }>' is not assignable to parameter of type 'OperatorFunction<{}, Action<any>>'.

我想知道为什么它不能编译?以及类型不匹配的原因,是什么使没有forkJoin的史诗在这种情况下无效?

编辑:我知道forkJoin对于单个可观察对象没有意义,但是我将1保持为较小示例

1 个答案:

答案 0 :(得分:0)

observable.pipe()中仅包含操作员

forkJoin是一个返回 observable 的运算符,这就是您收到该错误的原因。 Argument of type 'Observable' is not assignable to parameter of type 'OperatorFunction',即返回可观察值的forkJoin不能分配给运算符功能的类型。

另一方面,

switchMap是一个运算符,它返回一个OperatorFunction并以可观察的方式进行运算,这就是您的第一种方法起作用的原因。 switchMap(() => someObservable)someObservable在这种情况下为forkJoin()

从您的进口中也可以明显看出。您可能从rxjs库导入了forkJoin,而从rxjs/operators库导入了switchMap。