我有一个Angular 4应用程序,屏幕上的数据会定期刷新:
getData(): Observable<Data[]> {
return Observable.timer(0, 30000).switchMap(() => {
this.lastUpdate = new Date();
return this.activeDataStream;
});
}
activeDataStream定义为:
if (this.theUrl) {
this.activeDataStream =
<Observable<Data[]>>this.http.get(
this.theUrl, this.options)
.map(resp => {
return this.extractData(resp);
})
.share();
在我的订阅者中,我使用了此流:
ngOnInit() {
this.dataSubscriber = this.myService.getData()
.subscribe(
data=> {
this.group = this.summarizeData(data);
});
}
ngOnDestroy() {
this.dataSubscriber.unsubscribe();
}
如果服务器(.net WebApi REST服务)出现故障,流将继续尝试每30秒获取一次数据。当服务器回来时,似乎订户已断开连接。有没有什么好方法可以防止断开连接或重新连接?现在,用户必须意识到他们的数据已经过时并且点击了F5。
由于
答案 0 :(得分:2)
由于您在getData()
中致电ngOnInit()
,因此您可能希望在创建组件时进行一次订阅。
现在它取决于this.activeDataStream
(它是主题还是类似this.http.get(...)
?您可能会受到主题内部状态https://medium.com/@martin.sikora/rxjs-subjects-and-their-internal-state-7cfdee905156的影响
无论如何,当一个源Observable抛出一个错误时,该链被处理掉,除非你再次订阅,否则它永远不会产生任何东西。出于这个原因,您可以使用例如retry()
仅监听error
通知并自动重新订阅:
ngOnInit() {
this.dataSubscriber = this.myService.getData()
.retry()
.subscribe(data => {
this.group = this.summarizeData(data);
});
}
您也可以使用.catch(() => Observable.never())