2017-01-11 54 views
1

我想輪詢一些布爾變量,直到它變爲false。我想編寫一個Observable,它發出單個值並完成,只有當特定變量爲false時。以Rx方式定期輪詢

這裏是我特地用:

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

在RxJava中,這是一種方法,它會在takeWhile完成後立即清除所有內容。我假設你無權訪問同步標誌?因爲一旦將其設置爲false,您應該能夠直接發射該物品。

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