2017-01-11 2 views
1

Я хочу опросить некоторую переменную boolean, пока она не станет ложной. Я хотел бы составить Observable, который испускает одно значение и завершается, только когда конкретная переменная получает значение false.Периодически опрос в Rx-способе

Вот что я пришел с:

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

ли выше правильной (читай: самый элегантный & краткий) способ сделать это? Особенно мне интересно узнать об источнике, наблюдаемом здесь, который испускает каждые 250 мс, будет ли он отписано и очищено (основной таймер, уничтоженный в памяти == освобожденные ресурсы ОС), когда оператор takeWhile() выдает событие завершения? В скором времени безопасно использовать вышеупомянутое Наблюдаемое, как есть, без утечки каких-либо ресурсов (из-за «забытого» таймера)? Скорее всего, нет, но я бы хотел быть на 100% уверен.

P.S .: Я пишу это в RxJS, но другие платформы, вероятно, будут иметь похожий ответ, поэтому я не ограничиваю теги RxJS.

P.P.S .: Очевидно, я говорю о сценарии, когда я не могу преобразовать целевую переменную в Observable, вот и все. Это просто переменная, которую я должен проверять каждые 250 мс.

ответ

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

Смежные вопросы