为什么 switchMap(forkJoin) 失败但 switchMap(arr=>forkJoin(arr)) 工作正常?

时间:2021-05-19 10:41:25

标签: typescript rxjs

我有以下代码

const mySource:Observable<Observable<any>[]>

(...)

mySource.pipe(
   switchMap(arr=>forkJoin(arr));
)

按预期工作,但是

mySource.pipe(
   switchMap(forkJoin);
)

失败

REST error TypeError: You provided '0' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    RxJS 31
        subscribeTo
        from
        forkJoinInternal
        _trySubscribe
        subscribe
        innerSubscribe
        _innerSub

为什么第二个变体不起作用?

Stackblitz:https://stackblitz.com/edit/typescript-tztgpl?file=index.ts

请记住,这是一个运行时错误,与 IDE 无关。

1 个答案:

答案 0 :(得分:3)

这两个调用实际上并不等价。 switchMap 向其投影函数传递两个参数。来自源和内部索引的值。你可以在这里看到它:https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/switchMap.ts#L106

所以使用以下内容:

switchMap(forkJoin),

实际上相当于使用:

switchMap((value, index) => forkJoin(value, index)),

... 这显然会引发错误,因为 0 不是 Observable。顺便说一句,无论如何,这将在 RxJS 的未来版本中停止工作,因为 forkJoin 认为您正在列出已弃用的源 Observales (forkJoin([obs1, obs2], obs3)) 并且它不会订阅该数组中的单个 Observables。换句话说,它不会拉平链条。

您可以查看这个小演示:https://stackblitz.com/edit/rxjs-mgb3fx?devtoolsheight=60