【问题标题】:Build heartbeat service with RxJS使用 RxJS 构建心跳服务
【发布时间】:2017-03-06 16:18:40
【问题描述】:

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

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

目前我正在使用以下放置在角度服务中的 Observable:

  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 能够解决这个问题。

【问题讨论】:

    标签: angular typescript observable rxjs5


    【解决方案1】:

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

    希望这会有所帮助!

    【讨论】:

    • 我添加了上述操作符,它按预期工作。
    • 编辑:所以它部分解决了我的问题,但后来我意识到组件本身必须知道它是否应该忽略第一个响应,因为服务无法区分它的订阅者。所以,问题解决了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多