【问题标题】:RXJS forkJoin also takes Observable<[]>?RXJS forkJoin 也需要 Observable<[]>?
【发布时间】:2018-10-02 15:14:12
【问题描述】:

我有一个数字数组,我将每个数字转换为一个可观察的(在随机时间发出)

当所有 observable 都解决后,我会显示结果。

就像promise.all,所以我使用forkJoin

let arr: Array<Number> = [1, 2, 3, 4, 5];
let d = from(arr).pipe(mergeMap(f => myPromise(f)), toArray());
const example = forkJoin(d);
const subscribe = example.subscribe(val => console.log(val));

这确实按预期工作,我确实看到了随机(最大)时间后的总体结果。

但是,重新阅读文档,这个 ^ 应该不起作用。

请注意,dObservable &lt;{}[]&gt; 类型,因此它是数组的 Observable。

However the docs says

sources :SubscribableOrPromise 提供任意数量的 Observables 作为数组或作为参数直接传递给运算符

但是在这里我没有传递一个数组。 (意思是,这个:forkJoin(...d) 不起作用)。

问题:

我是否错误地使用了 forkJoin?以及如何与文档解决?

OnlineDemo

【问题讨论】:

  • 您正在将数组的 Observable 传递给 forkJoin,对吗? (d 是数组的 Observable)
  • @siva636 我正在传递一个可观察的数组 - 正如您在图像中看到的那样。但是文档并没有说它需要可观察的数组。他们说它需要一个数组(!)或单个单独的项目,即 a、b、c、d
  • Doc 说“任何数量的 OBSERVABLES 都可以作为数组提供......”。根据我的理解,这意味着 Observables 数组。
  • @siva636 对。但在我的示例中,没有 Observables 数组,而是 Observable of array。如图所示,dObservable&lt;[]&gt;
  • d 是一个 Observable 数组,但该数组包含 Observables?

标签: javascript rxjs


【解决方案1】:

好吧,“似乎”感谢mergeMaptoArray,但如果您查看输出,它可能不是您想要的。它在另一个数组中发出结果数组,而您似乎只想获得一个结果数组。

这就是你现在得到的:

[
  [ "Promise Resolved: 1", "Promise Resolved: 2", "Promise Resolved: 3", "Promise Resolved: 4", "Promise Resolved: 5" ],
]

这里发生的事情是,您使用 mergeMap 将每个数字投影到 Promise 中,然后使用 toArray 收集所有结果,并且仅在链完成之后(它将结果数组作为单个发射发出)。然后forkJoin 实际上并没有订阅每个单独的 Promise,而只是订阅 toArray 之后的结果 Observable,这很好。

文档是正确的,因为它允许多个用例,例如:

forkJoin(a, b, c); // Observables as arguments passed directly to the operator

forkJoin([a, b, c]); // Observables as an array

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2018-12-06
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
相关资源
最近更新 更多