【问题标题】: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】:
这是正确的行为,当发送complete 或error 通知时,观察者取消订阅并释放链。
您可以使用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))