使用 RxJS 构建心跳服务

Build heartbeat service with RxJS

我想为我的 angular2 网站构建一个 heatbeat 服务。远程设备是网站的主机,客户端应该能够检测到该设备是否不是 reachable/offline。 该服务应定期轮询(网络服务器)远程设备。

我知道一个失败的HTTP-Call不能直接等同于整个设备的online/offline状态,但对于我的要求应该足够了。

目前我正在使用以下 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/service,然后在设备状态更改时显示通知。

原则上 Observable 可以工作,但它会向订阅它的组件提供连续的 1(在线)和 0(离线)流。现在我必须向组件(以及使用此服务的所有其他组件)添加一些逻辑来处理例如两个连续的零,通知只显示一次。

如果服务可以完成这项额外的工作并且仅在设备状态发生变化时(向组件)提供结果,那将会更加清晰和更好的关注点分离。我还尝试将 Observable.timerflatMap 一起使用,但未能使其正常工作,但我希望 rxjs 提供解决此问题的方法。

您可以使用 distinctUntilChanged 运算符,它将确保只传递不同的值。

希望对您有所帮助!!