【问题标题】:Wait for two Observables then return a promise of a different Observable?等待两个 Observable 然后返回一个不同 Observable 的承诺?
【发布时间】:2018-08-17 06:58:55
【问题描述】:

我有两个不同类型的 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 似乎在“订阅”/执行前两个承诺,然后我可以看到它正在等待两者来解决它只是返回类型是错误的我想想。

【问题讨论】:

  • .do 不返回任何内容——它只是为了利用可观察的流。我想你可能只想.map

标签: typescript rxjs reactive-programming


【解决方案1】:

do(或更好的tap)用于在不干扰流的情况下对观察到的数据进行操作。它返回与它作用的相同的 observable。

你需要map你对新observable的值。

【讨论】:

    【解决方案2】:

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

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

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

    编辑:您提到的mergeMapconcatMap 是正确的,但最重要的逻辑是forkJoinforkJoin 将在所有源 Observable 完成后发出单个项目(每个源 Observable 的最后发射的数组)。这意味着无论您使用 mergeMap 还是 concatMap 都没有关系,因为它们会收到一个他们忽略的单个值(一个数组)并只返回 $C Promise。

    【讨论】:

    • mergeMap 真的会等待前两个 Observable 解决吗?
    • 这与mergeMapconcatMap 均无关。 forkJoin 运算符负责等待$A$B 发出至少一个值并完成。
    • 我还是有点困惑。所以(在这里)[learnrxjs.io/operators/transformation/concatmap.html]我读到了mergeMap的区别,上面写着Because concatMap does not subscribe to the next observable until the previous completes, the value from the source delayed by 2000ms will be emitted first. Contrast this with mergeMap which subscribes immediately to inner observables...所以我明白mergeMap会立即订阅forkJoin并且不会等待它完成?跨度>
    猜你喜欢
    • 1970-01-01
    • 2016-09-15
    • 2017-02-03
    • 2021-08-28
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多