Typescript 从web服务处理响应延迟和其他错误更新数据
EventService组件每10000毫秒检索一个项目列表Typescript 从web服务处理响应延迟和其他错误更新数据,typescript,functional-programming,angular,rxjs,Typescript,Functional Programming,Angular,Rxjs,EventService组件每10000毫秒检索一个项目列表 @Injectable() export class EventsService { getEventsStream(): Observable<Event[]> { let url = 'event/view'; return Observable.interval(10000).flatMap(() => { return this.http
@Injectable()
export class EventsService {
getEventsStream(): Observable<Event[]> {
let url = 'event/view';
return Observable.interval(10000).flatMap(() => {
return this.http.get(url);
})
.map((response: Response) => {
return (<any>response.json()).map(item => {
return item;//new Event(item);
});
});
}
}
@Injectable()
导出类事件服务{
getEventsStream():可观察{
让url='事件/视图';
返回可观察间隔(10000).flatMap(()=>{
返回此.http.get(url);
})
.map((响应:响应)=>{
return(response.json()).map(item=>{
返回项;//新事件(项);
});
});
}
}
但是,通过这种方式,我不会处理web服务延迟响应或不可用的情况
提前谢谢 您可以使用
重试
操作符执行以下操作:
return Observable.interval(10000).flatMap(() => {
return this.http.get(url);
})
.retryWhen(error => error.delay(30000)) // <----
.map((response: Response) => {
return (<any>response.json()).map(item => {
return item;//new Event(item);
});
});
返回可观察间隔(10000).平面图(()=>{
返回此.http.get(url);
})
.retryWhen(error=>error.delay(30000))//{
返回(
以这种方式工作:
let obs;
return Observable
.create((o) => {
obs = o;
obs.next();
})
.flatMap(() => {
//console.log("executing request");
return this.http.get(url);
})
.retryWhen(error => error.delay(30000))
.map((response: Response) => {
//console.log("response received");
setTimeout(() => {
//console.log("pushing next");
obs.next();
}, 10000);
return (<any>response.json()).map(item => {
return item;//new Event(item);
});
});
let-obs;
可观测回波
.创建((o)=>{
obs=o;
obs.next();
})
.flatMap(()=>{
//日志(“执行请求”);
返回此.http.get(url);
})
.retryWhen(error=>error.delay(30000))
.map((响应:响应)=>{
//控制台日志(“收到响应”);
设置超时(()=>{
//console.log(“推下一步”);
obs.next();
}, 10000);
return(response.json()).map(item=>{
返回项;//新事件(项);
});
});
这似乎是一个正确的解决方案吗?好的,谢谢,我会尝试。如果web服务响应非常延迟,我如何在响应到达后才发布新的响应来处理这个事实?我在您建议时使用Retry重新编写了代码。您认为建议的解决方案正确吗?谢谢。