Typescript 从web服务处理响应延迟和其他错误更新数据

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

EventService组件每10000毫秒检索一个项目列表

@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服务延迟响应或不可用的情况

  • 在响应到达10000毫秒后,如何通过发出新请求来处理此问题
  • 如何通过在错误发生30000毫秒后发出新请求来处理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重新编写了代码。您认为建议的解决方案正确吗?谢谢。