以Rx方式定期轮询

时间:2017-01-11 21:34:34

标签: javascript rx-java rxjs system.reactive rxjs5

我想轮询一些布尔变量,直到它变为false。我想编写一个Observable,只有当特定变量变为false时才会发出单个值并完成。

以下是我的意见:

    let waitTask = Observable.interval(250)
      .do(() => console.log("DEBUG: Waiting for sync to finish."))
      .takeWhile(() => this.syncing)
      .last()
      .defaultIfEmpty();

以上是正确的(阅读:最优雅和简洁)方式吗?特别是我想知道这里的源Observable,每250ms发出一次,当takeWhile()运算符发出完成事件时,是否会取消订阅并清理(在内存中销毁底层计时器= =释放OS资源)?很快,使用上面的Observable是安全的,不会泄漏任何资源(因为“忘记”计时器)?很可能没有,但我想100%肯定。

P.S。:我在RxJS中写这个,但其他平台可能会有类似的答案,所以我不会将标签限制为RxJS。

P.P.S。:显然,我正在讨论当我无法将目标变量转换为Observable时的情况,这就是重点。这只是我必须每250ms检查一次的变量。

2 个答案:

答案 0 :(得分:1)

您的疑虑是有效的。 然而,他们专注于错误的地方。 虽然是,takeWhile运算符将导致序列完成,这将释放计时器,您实际上想要关注订阅者。

在任何Rx解决方案中,如果订阅者未能捕获其订阅令牌(一次性),则他们无法确定地处置它。 这就是资源泄漏的地方。

关于代码的一个注释:takewhile正在评估外部状态是一个问题。 如果this.syncing本身是可观察的会更好,那么你可以组成两个takeUntil。你在JS,所以我假设一个单一的线程世界,这使它更安全一点,但我仍然会避免它。

有关资源管理和生命周期管理,请参阅http://introtorx.com/Content/v1.0.10621.0/03_LifetimeManagement.html

有关Rx中轮询的示例,请参阅https://github.com/LeeCampbell/RxCookbook/blob/master/Repository/Polling.md

答案 1 :(得分:0)

在RxJava中,这是一种方法,它会在takeWhile完成后立即清理所有内容。我假设你无法访问同步标志?因为这样你就可以在将项目设置为false时直接发出项目。