我有以下代码
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 无关。
答案 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