等待两个Observable然后返回一个不同的Observable的承诺?

时间:2018-03-08 19:48:01

标签: typescript rxjs reactive-programming

我有两个不同类型的Observable,我想要做的是等待两个都至少发出一次,然后以某种方式立即返回第三个Observable的承诺,而另一个返回类型。

现在我有这个:

return Observable.forkJoin([$A, $B])
    .do(() => {
        return $C;
    })
    .toPromise()
    .then(result => result);

其中$AObservable<AType>$BObservable<BType>,但我不在乎这些结果是什么,我只是想知道他们何时完成。 然后我想返回一个toPromise $C Promise<CType>

由于某些原因,这不起作用,我认为它返回Promise<Void[]>Observable<Void[][]>或类似的东西,但我不知道如何调试它。但我认为我有正确的想法,因为forkJoin似乎是“订阅”/执行前两个承诺,然后我可以看到它 等待两者解决它只是返回类型是错误的我认为

2 个答案:

答案 0 :(得分:1)

你几乎是正确的,但do运算符只是执行副作用,而且根本不会修改链。

相反,您应该使用concatMapmergeMap也可以),等待内部Promise解析然后返回它的值。你说你想要返回一个Promise,所以你仍然会使用toPromise,因为这会把整个链变成一个Promise:

return Observable.forkJoin([$A, $B])
    .concatMap(() => $C)
    .toPromise()
    .then(result => result);

修改:您提到的关于mergeMapconcatMap的内容是正确的,但forkJoin是最重要的逻辑。在所有源Observable完成后,forkJoin将发出单个项目(来自每个源Observable的最后一个排放数组)。这意味着,如果您使用mergeMapconcatMap并不重要,因为他们会收到他们忽略的单个值(数组)并返回$C承诺。

答案 1 :(得分:0)

do(或更好,tap)用于对观察到的数据进行操作而不会干扰流量。它会返回它所作用的相同的可观察量。

您需要map您对新观察者的价值。