我正在合并两个Observable。 第一个获取init的当前温度。 第二个以一定的间隔轮询API。 如果Api调用失败,则不会恢复Observable间隔。
我怎么能恢复它?
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?
});
}
有什么想法吗? TY
答案 0 :(得分:0)
使用http状态代码,只有当200个让我们说:
时才可以检索一个observable
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?
});
}
&#13;
重要的是这个返回Observable.onErrorResumeNext();
答案 1 :(得分:0)
使用catch。
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调用,因为它不会为空的observable发出。
当然,您可能会遇到错误的替代行为,但您需要抓住它以避免遇到问题。