我有一个数字数组,我将每个数字转换为一个可观察的数据(随机时间发出)
当所有可观察物都被解析后,我会显示结果。
就像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));
这确实按预期工作,我确实看到随机(最长)时间后的整体结果。
然而,重新阅读文档,这^应该没有用。
请注意,d
的类型为Observable <{}[]>
,因此它是一个Observable of array。
来源:SubscribableOrPromise提供了任意数量的Observable 作为数组或直接传递给运算符的参数。
但在这里我没有传递数组。 (意思是,forkJoin(...d)
不起作用。)
问题:
我是否错误地使用了forkJoin?以及如何通过文档解决?
答案 0 :(得分:2)
好吧,“看起来像”它感谢mergeMap
和toArray
,但是如果你看一下输出,它可能不是你想要的。它在另一个数组中发出结果数组,而看起来你只想得到一组结果。
这就是你现在所得到的:
[
[ "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