Angular 2,轮询 http 请求并等待缓慢的响应

Posted

技术标签:

【中文标题】Angular 2,轮询 http 请求并等待缓慢的响应【英文标题】:Angular 2, Polling http request and wait for slow responses 【发布时间】:2016-11-11 09:33:11 【问题描述】:

我有一个每 3 秒从服务器获取数据的服务。 有时服务器很慢,许多响应会在 5 或 6 秒后出现。 发生这种情况时,我的服务开始取消每个请求,而不是等待待处理的请求。 我怎样才能防止这种情况发生?

public getCallDiagnostic():Observable<IRespWidgets>

        let body = JSON.stringify(manager:"CallDiagnosticServiceManager",
                                   action:"GetCallDiagnostic",
                                   WEB_USER_TOKEN:this._authenticationService.getUserToken());     
        let options = new RequestOptions(headers: new Headers('Content-Type': 'application/json'));

        return  Observable.timer(0,3000)
                .switchMap(()=>this._http.post(this._apiUrl,body,options))                      
                .map(res => <IRespWidgets>res.json().data)          
                .catch(this.handleError);       
    

【问题讨论】:

【参考方案1】:

由于您使用的是 switchMap,您的请求将被取消。如果您想收到每个请求的响应,只需使用 mergeMap:

return  Observable.timer(0,3000)
            .mergeMap(()=>this._http.post(this._apiUrl,body,options))                      
            .map(res => <IRespWidgets>res.json().data)          
            .catch(this.handleError);       

这永远不会取消请求,您会从每个请求中获得响应。

编辑:如果您想在前一个请求到达后立即执行下一个请求,您可以使用 concatMap。 ConcatMap 将获取下一个值并对其进行处理。只要不处理前一个值,它就不会获取下一个值(即使它到达)。

return  Observable.timer(0,3000)
            .concatMap(()=>this._http.post(this._apiUrl,body,options))                      
            .map(res => <IRespWidgets>res.json().data)          
            .catch(this.handleError);    

【讨论】:

非常感谢只有在前一个到达时才发送请求的更好方法是什么? @KwintenP 我可以像我在这里做的那样做吗:plnkr.co/edit/6fBPFCus3HhZmCFBXFKq 当然我只是指每个请求都应该等待前一个请求完成的要求 我不认为使用 repeat 将允许您仅在前一个请求完成后才开始执行下一个请求。

以上是关于Angular 2,轮询 http 请求并等待缓慢的响应的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot实现http请求的异步长轮询【2】— AsyncHandlerInterceptor方式

轮询异步任务,然后等待 1 次成功或所有响应被拒绝

websocket

Angular等待所有订阅完成

Angular 5 Universal 在服务器端渲染期间等待 http 请求返回

apache_conf Angular 2中的HTTP轮询