我有应用程序,其中我有函数get()
,它使用http GET返回Observable.interval(1000)
。
在app.component中我订阅了这个Observable并在屏幕上打印了一些来自GET的值。
Everythings工作正常,直到get响应返回400 - 服务器不时地发送404-正常。但当我收到400时,我的订阅停止工作。 屏幕仅显示最后一个值并停止“刷新”
以下是一些代码:
getAct(symbol:string): Observable<Act> {
return Observable
.interval(1000)
.flatMap(() => {
return this.http.get(url)
.map((res: Response):Act => (res.json()))
.catch(err => {
return Observable.throw(err);
});
});
}
以下是订阅的代码:
this.actSub = this.actService
.getAct(this.symbol)
.subscribe(
act => {
console.log("ok");
this.act = act;
}
},
err => {console.warn(err);},
()=>console.log("Done")
);
所以程序运行良好 - 29取得成功,但当它恢复400停止时,那里没有“ok”。
问题出在哪里?我的getAct()是错误的,或者当我订阅时我编写了不好的代码?
请帮助,我试着修复它,但我不能。
答案 0 :(得分:1)
我可以做这样的事情,但我认为这是非常糟糕的解决方案。
get(){
this.actSub = this.actService
.getAct(this.symbol)
.subscribe(
act => {
console.log("ok");
this.act = act;
}
},
err => {
console.warn(err);
this.get();
},
()=>console.log("Done")
);
}
答案 1 :(得分:1)
有几个RxJS运算符可以处理错误。
最简单的方法是使用retry():
return this.http.get(url)
.retry()
.map(res => res.json());
这是一种激进的策略,因为只要请求失败,它就会重新订阅原始的observable(this.http.get(...)
)。你最终可能会非常努力地击中服务器。
您可能希望使用retryWhen()代替,这会让您在重试之前引入一点延迟,例如:
return this.http.get(url)
.retryWhen(errors => errors.delay(2000)) // 2-second delay before retrying
.map(res => res.json());