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



我有一个每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);       
    }

您的请求正在被取消,因为您正在使用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);    

相关内容

  • 没有找到相关文章

最新更新