【问题标题】:RxJS - pausing an Observable until second Observable completes,RxJS - 暂停一个 Observable 直到第二个 Observable 完成,
【发布时间】:2018-03-17 09:31:14
【问题描述】:

我有一个场景,其中 1 个 observable 监听事件,然后应该触发另一个异步事件,并等待它运行源 Observable 中的下一个项目。

第一个 observable 可以比异步事件更快地触发,并且它必须等待异步事件完成才能从第一个 observable 获取另一个项目。

所以.. 基本上我需要从第一个 observable 中设置一个“队列”(因为我不能丢失源 1 中的数据)

源 2 应该一次从队列中取出 1 个项目,运行它,从队列中删除该项目,然后进入队列中的下一个项目。

src1-  --ev1---ev2---ev3----ev4---ev5--ev6---
src2-  --ev1------------ev2-------------ev3--------ev4-------ev5------ev6
--------------async-----------async---------async------async------asyc

我正在查看 RX 文档,似乎 pausibleBuffered 可能是一个解决方案,但我注意到它已在 RX5 中被删除,这就是我正在使用的。有人可以提供建议作为实现此目标的正确方法吗? 谢谢!

【问题讨论】:

  • 就目前而言,您的图表尚不清楚,尽管我赞扬您首先编写了一个。这确实有点帮助,但并不完全清楚。无论如何,对于措辞问题,这似乎是一个无损背压问题。无损背压的一个问题是,如果您的 src1 持续时间过长,您最终将耗尽内存(或任何其他相关的有限资源)。否则你可以参考这个:github.com/ReactiveX/rxjs/issues/1542
  • 我认为这是一个非常相似的问题stackoverflow.com/questions/46469442/…
  • 感谢 cmets,是的,我可能没有像我应该的那样解释它。我能够在 src1 和 src2 observables 上使用 combineLatest。检查队列的状态以及是否仍有异步操作正在进行。比我预期的要容易:)

标签: rxjs observable rxjs5


【解决方案1】:

您可以使用mergeScan 一个一个地运行异步操作,因为它需要前一个异步操作的结果来运行异步操作。

const src2 = src1.mergeScan((_, value) => doSomething(value));

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeScan

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多