我有两个不同类型的Observable,我想要做的是等待两个都至少发出一次,然后以某种方式立即返回第三个Observable的承诺,而另一个返回类型。
现在我有这个:
return Observable.forkJoin([$A, $B])
.do(() => {
return $C;
})
.toPromise()
.then(result => result);
其中$A
是Observable<AType>
而$B
是Observable<BType>
,但我不在乎这些结果是什么,我只是想知道他们何时完成。 然后我想返回一个toPromise
$C
Promise<CType>
。
由于某些原因,这不起作用,我认为它返回Promise<Void[]>
或Observable<Void[][]>
或类似的东西,但我不知道如何调试它。但我认为我有正确的想法,因为forkJoin似乎是“订阅”/执行前两个承诺,然后我可以看到它 等待两者解决它只是返回类型是错误的我认为
答案 0 :(得分:1)
你几乎是正确的,但do
运算符只是执行副作用,而且根本不会修改链。
相反,您应该使用concatMap
(mergeMap
也可以),等待内部Promise解析然后返回它的值。你说你想要返回一个Promise,所以你仍然会使用toPromise
,因为这会把整个链变成一个Promise:
return Observable.forkJoin([$A, $B])
.concatMap(() => $C)
.toPromise()
.then(result => result);
修改:您提到的关于mergeMap
和concatMap
的内容是正确的,但forkJoin
是最重要的逻辑。在所有源Observable完成后,forkJoin
将发出单个项目(来自每个源Observable的最后一个排放数组)。这意味着,如果您使用mergeMap
或concatMap
并不重要,因为他们会收到他们忽略的单个值(数组)并返回$C
承诺。
答案 1 :(得分:0)
do
(或更好,tap
)用于对观察到的数据进行操作而不会干扰流量。它会返回它所作用的相同的可观察量。
您需要map
您对新观察者的价值。