【问题标题】:Why switchMap(forkJoin) fails but switchMap(arr=>forkJoin(arr)) works fine?为什么 switchMap(forkJoin) 失败但 switchMap(arr=>forkJoin(arr)) 工作正常?
【发布时间】:2021-05-19 19:36:59
【问题描述】:

我有以下代码

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 相关的内容。

【问题讨论】:

  • 我相信这是因为forkJoin 的类型签名不能分配给switchMap 回调类型。可能是因为switchMap 期望第二个参数的类型与forkJoin 的第二个参数不同。你用的是哪个版本的 rxjs?
  • Intellij 实际上喜欢更多不起作用的变体,并抱怨在工作选项中不推荐使用 forkJoin ;) rxjs verion "version": "6.6.3",
  • 我认为问题出在 IDE 而不是类型。这里stackblitz.com/edit/typescript-4deq3j?file=index.ts同样的例子没有类型错误
  • 但是这个错误是一个运行时错误——我完全忽略了 IDE 所说的任何内容。

标签: typescript rxjs


【解决方案1】:

这两个调用实际上是不等价的。 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

【讨论】:

  • 感谢马丁的回答。你忘了分叉/保存你的堆栈闪电战吗?那里的一切似乎与我无关。
  • 感谢您的解释。这是我对传递函数的误用,因为它是 Java 的方法引用。
猜你喜欢
  • 2017-11-12
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2011-11-14
  • 2012-02-13
相关资源
最近更新 更多