Создайте сервис сердцебиения с помощью RxJS

Я хочу создать службу 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 предоставит решение этой проблемы.


person Akkusativobjekt    schedule 06.03.2017    source источник


Ответы (1)


вы можете использовать оператор distinctUntilChanged, он обеспечит передачу только различных значений.

Надеюсь это поможет!!

person Madhu Ranjan    schedule 06.03.2017
comment
Я добавил упомянутого оператора, и он работает как положено. - person Akkusativobjekt; 29.03.2017
comment
Редактировать: Таким образом, это частично решило мою проблему, но затем я понял, что сам компонент должен знать, должен ли он игнорировать первый ответ, потому что служба не может отличить своих подписчиков. Итак, проблема решена, спасибо! - person Akkusativobjekt; 29.03.2017