使用Angular 4中的计时器上的Observable流从服务器恢复

时间:2017-10-26 19:47:08

标签: angular rxjs

我有一个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。

由于

1 个答案:

答案 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())

以静默方式忽略该错误