使用 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.timer
与 flatMap
一起使用,但未能使其正常工作,但我希望 rxjs 提供解决此问题的方法。
您可以使用 distinctUntilChanged
运算符,它将确保只传递不同的值。
希望对您有所帮助!!
我想为我的 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.timer
与 flatMap
一起使用,但未能使其正常工作,但我希望 rxjs 提供解决此问题的方法。
您可以使用 distinctUntilChanged
运算符,它将确保只传递不同的值。
希望对您有所帮助!!