Я хочу создать службу Heatbeat для своего веб-сайта angular2. Удаленное устройство является хостом веб-сайта, и клиент должен иметь возможность определить, недоступно ли устройство или находится в автономном режиме. Служба должна периодически опрашивать удаленное устройство (веб-сервер).
Я знаю, что неудачный HTTP-вызов нельзя напрямую сопоставить со статусом онлайн/офлайн всего устройства, но для моих требований этого должно быть достаточно.
В настоящее время я использую следующий Observable, который находится внутри службы angular:
public getStatus() {
return this.http.get(this.config.apiEndpoint + this.fileName)
.map(() => { return '1'; })
.timeout(500)
.catch(() => {return '0';})
.retry()
.delay(1500)
.repeat();
}
Целью наблюдаемого является почти пустой файл на веб-сервере. Компонент подписывается на наблюдаемую/службу, а затем показывает уведомление, если статус устройства изменяется.
В принципе Observable работает, но он обеспечивает непрерывный поток единиц (онлайн) и нулей (офлайн) компоненту, который на него подписался. Теперь мне нужно добавить некоторую логику к компоненту (и любому другому компоненту, который использует эту службу), чтобы обрабатывать, например, два последовательных нуля, что уведомление отображается только один раз.
Было бы намного чище и лучше разделять обязанности, если бы служба могла выполнять эту дополнительную работу и предоставлять результат (компоненту) только при изменении состояния устройства. Я также пытался использовать Observable.timer
с flatMap
, но не смог заставить его работать, но я ожидаю, что rxjs предоставит решение этой проблемы.