Angular2 - GET 400 禁用我的 observable.subscribe 间隔
Angular2 - GET 400 disabling my observable.subscribe with interval
我有一个应用程序,其中有功能 get()
,它通过 http GET 返回我 Observable.interval(1000)
。
在 app.component 中,我订阅了这个 Observable 并在屏幕上打印了一些来自 GET 的值。
一切正常,直到得到响应 returns 400 - 服务器不时发送 404 - 正常。但是当我收到 400 时,我的订阅停止工作。
屏幕仅显示最后一个值并停止 "refreshing"
这是一些代码:
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() 是错误的,还是我订阅的时候编码出了问题?
请帮忙,我试图修复这个,但我不能。
我可以做这样的东西,但我认为这是一个非常糟糕的解决方案。
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")
);
}
有几个 RxJS 运算符可以处理错误。
最简单的方法是使用 retry():
return this.http.get(url)
.retry()
.map(res => res.json());
这是一种激进的策略,因为一旦 请求失败,它将re-subscribe 到原始可观察对象(this.http.get(...)
)。您最终可能会严重打击服务器。
您可能想改用 retryWhen(),这会让您在重试之前引入轻微的延迟,例如:
return this.http.get(url)
.retryWhen(errors => errors.delay(2000)) // 2-second delay before retrying
.map(res => res.json());
我有一个应用程序,其中有功能 get()
,它通过 http GET 返回我 Observable.interval(1000)
。
在 app.component 中,我订阅了这个 Observable 并在屏幕上打印了一些来自 GET 的值。
一切正常,直到得到响应 returns 400 - 服务器不时发送 404 - 正常。但是当我收到 400 时,我的订阅停止工作。 屏幕仅显示最后一个值并停止 "refreshing"
这是一些代码:
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() 是错误的,还是我订阅的时候编码出了问题?
请帮忙,我试图修复这个,但我不能。
我可以做这样的东西,但我认为这是一个非常糟糕的解决方案。
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")
);
}
有几个 RxJS 运算符可以处理错误。
最简单的方法是使用 retry():
return this.http.get(url)
.retry()
.map(res => res.json());
这是一种激进的策略,因为一旦 请求失败,它将re-subscribe 到原始可观察对象(this.http.get(...)
)。您最终可能会严重打击服务器。
您可能想改用 retryWhen(),这会让您在重试之前引入轻微的延迟,例如:
return this.http.get(url)
.retryWhen(errors => errors.delay(2000)) // 2-second delay before retrying
.map(res => res.json());