为什么RxJS中switchMap(forkJoin)报错,switchMap(arr=>forkJoin(arr))正常?
原因说明
两种写法的差异本质是switchMap投影函数的传参规则和forkJoin的入参解析规则不匹配导致的:
switchMap传入的投影函数会自动接收两个参数:第一个是上游Observable发射的Observable<any>[]数组,第二个是当前发射值的序号索引(从0开始递增的数字)。forkJoin支持两种合法入参形式:要么传入一个包含多个Observable的数组,要么传入多个独立的Observable作为可变参数。
第一种写法switchMap(arr => forkJoin(arr))中,你手动指定仅将第一个参数(Observable数组)传给forkJoin,第二个索引参数被忽略,forkJoin可以正常解析数组参数,因此运行符合预期。
第二种写法switchMap(forkJoin)相当于直接把forkJoin作为投影函数传入,switchMap会把自身收到的所有参数全部传递给forkJoin,此时forkJoin实际收到的入参为(Observable数组, 0)(首次触发时索引为0),会被forkJoin判定为你传入了两个独立的Observable参数:
- 第一个参数是Observable数组,可正常解析
- 第二个参数是数字
0,不属于Observable/Promise/Array/Iterable等可转换为流的合法类型,因此触发对应的类型报错。
你可以通过以下代码复现完全相同的报错,逻辑与第二种写法完全一致:
forkJoin([of(1), of(2)], 0).subscribe(console.log)
内容的提问来源于stack exchange,提问作者Antoniossss
相关产品推荐
相关产品推荐

