2016-11-11 206 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