关于 javascript:Catch in Observable 停止来自 Observable.interval 的 HTTP 调用

Catch in Observable stops HTTP Calls from Observable.interval

1
2
3
4
Observable.interval(10000)
     .switchMap(() => this.http.get(url))
     .catch (err => Observable.empty())
     .subscribe(data => render(data))

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


1
2
3
4
5
Observable.interval(10000)
     .switchMap(() => this.http.get(url)
     .map(res => res.json())
     .catch (err => Observable.empty()))
     .subscribe(data => render(data))

试试这个:

1
2
3
4
5
6
7
8
9
10
11
12
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)}
 )

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

1
2
3
if(!data[error]){
  render(data)
}

希望对你有帮助


takeUntil() 的 observable.

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

更多信息请点击这里


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

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

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