我想轮询一些布尔变量,直到它变为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检查一次的变量。
答案 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
时直接发出项目。