如何在错误时恢复RxJs可观察间隔
问题描述:
我正在合并两个可观察对象。 第一个获得init的当前温度。 第二个API以一定的时间间隔轮询API。 如果Api调用失败,则不会恢复Observable时间间隔。如何在错误时恢复RxJs可观察间隔
我该如何恢复?
getCurrentTemp(): Observable<number> {
return this.http.get(this.environmentService.getTemperatureUrl())
.map((res: Response) => res.json())
.switchMap(() => res.temp);
}
pollCurrentTemperature(): Subscription {
const temp$ = this.getCurrentTemp();
const tempInterval$ = Observable
.interval(3000)
.flatMap(() => this.getCurrentTemp());
return temp$
.take(1)
.merge(tempInterval$)
.subscribe((temp: number) => {
console.log('temp', temp);
}, (err) => {
console.log('error', err);
// When the api fails my interval does not resume. How can I retry it?
});
}
任何想法?泰
答
使用HTTP状态代码,你可以检索可观察到的只有当它的200让我们说:
getCurrentTemp(): Observable<number> {
return Observable.from(
[
{ value: 1, status: 200 },
{ value: 2, status: 200 },
{ value: 3, status: 200 },
{ value: 4, status: 200 },
{ value: 5, status: 200 },
{ value: 6, status: 400 }])
.switchMap((x: any) => {
if (x.status === 200) {
return Observable.of(x.value);
}
return Observable.onErrorResumeNext();
});
}
pollCurrentTemperature(): Subscription {
const temp$ = this.getCurrentTemp();
const tempInterval$ = Observable
.interval(3000)
.flatMap(() => this.getCurrentTemp());
return temp$
.take(1)
.merge(tempInterval$)
.subscribe((temp: number) => {
console.log('temp', temp);
}, (err) => {
console.log('error', err);
// When the api fails my interval does not resume. How can I retry it?
});
}
最重要的一点是这个回报Observable.onErrorResumeNext();
答
使用catch。
美中不足的是:从onError的通知,通过持续的序列无误
getCurrentTemp(): Observable<number> {
return this.http.get(this.environmentService.getTemperatureUrl())
.map((res: Response) => res.json())
.catch(error => {
console.log('Error occured');
return Observable.empty();
});
.switchMap(() => res.temp);
}
恢复将捕获错误并默默地在其位置返回empty观察到。实际上,switchmap会无声地跳过失败的api调用,因为它不会发出空的可观察对象。
当然,你可能会有一个错误的替代行为,但你需要赶上它,以避免你面临的问题。
也许这可能有所帮助:https://stackoverflow.com/a/34999441/2829204 – CozyAzure
你想要间隔从最后一个没有失败的'索引'继续? – martin