RXJS forkJoin也需要Observable< []>?

时间:2018-04-22 13:29:36

标签: javascript rxjs

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

当所有可观察物都被解析后,我会显示结果。

就像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));

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

然而,重新阅读文档,这^应该没有用。

enter image description here

请注意,d的类型为Observable <{}[]>,因此它是一个Observable of array。

However the docs says

  

来源:SubscribableOrPromise提供了任意数量的Observable   作为数组或直接传递给运算符的参数

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

问题:

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

OnlineDemo

1 个答案:

答案 0 :(得分:2)

好吧,“看起来像”它感谢mergeMaptoArray,但是如果你看一下输出,它可能不是你想要的。它在另一个数组中发出结果数组,而看起来你只想得到一组结果。

这就是你现在所得到的:

enter image description here

[
  [ "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