2016-11-11 7 views
0

3秒ごとにサーバーからデータを取得するサービスがあります。 サーバが非常に遅く、多くの応答が5または6秒後に発生することがあります。 これが起こると、私のサービスは保留中のものを待つのではなく、各要求を取り消し始めます。 どうすればこの問題を防ぐことができますか?角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

私は使用しないと思いますrepeatは、前の処理が終了したときにのみ次の要求を開始することができます。 – KwintenP

関連する問題