2016-11-11 87 views
0

我有一种服务,每3秒从服务器获取数据。 有时服务器速度很慢,5或6秒后出现很多响应。 发生这种情况时,我的服务开始取消每个请求,而不是等待待处理的请求。 我该如何预防?Angular 2,轮询http请求并等待慢响应

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);  
    } 

回答

2

由于您使用的是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);  
+0

非常感谢 只有当前一个到达时才发送请求的更好方法是什么? –

+0

@KwintenP我可以这样做,就像我在这里所做的一样:http://plnkr.co/edit/6fBPFCus3HhZmCFBXFKq Ofcourse我只指的是每个请求应该等待前一个请求完成的要求 –

+0

我不认为使用重复将允许您只在上一个完成时才开始执行下一个请求。 – KwintenP