【问题标题】:Catch in Observable stops HTTP Calls from Observable.intervalObservable 中的 Catch 停止来自 Observable.interval 的 HTTP 调用
【发布时间】:2017-08-16 13:56:07
【问题描述】:
Observable.interval(10000)
     .switchMap(() => this.http.get(url))
     .catch (err => Observable.empty())
     .subscribe(data => render(data))

我们每 10 秒进行一次 HTTP 调用。如果发生错误,observable 将完成,它不再进行任何调用。如何预防?

【问题讨论】:

    标签: javascript angular rxjs observable


    【解决方案1】:

    这是正确的行为,当发送completeerror 通知时,观察者取消订阅并释放链。

    您可以使用retry() 操作符重新订阅,但很难从这个简短的描述中看出您的目标是什么。

    Observable.interval(10000)
        .switchMap(() => this.http.get(url))
        .retry()
        .subscribe(data => render(data))
    

    【讨论】:

      【解决方案2】:

      takeUntil() 的 observable。

      RxJS 实现了 takeUntil 操作符。您可以向它传递 Observable 或 Promise,它将监视触发 takeUntil 以停止镜像源 Observable 的项目。

      更多信息click here

      【讨论】:

        【解决方案3】:

        试试这个:

        let dataX = Observable.interval(10000)
         .switchMap(() => this.http.get(url));
        
        let caught = dataX.catch(
        Observable.return({
        error: 'There was an error in http request'
        }))
        
        caught.subscribe((data) => { return render(data) },
        // Because we catch errors now, `error` will not be executed
        (error) => {console.log('error', error.message)}
         )
        

        如果你愿意,你可以在错误发生时设置任何条件

        if(!data[error]){
          render(data)
        }
        

        希望对你有帮助

        【讨论】:

          【解决方案4】:
          Observable.interval(10000)
               .switchMap(() => this.http.get(url)
               .map(res => res.json())
               .catch (err => Observable.empty()))
               .subscribe(data => render(data))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-22
            • 2016-12-01
            相关资源
            最近更新 更多