2016-12-21 6 views
0

私は、結果を得るまで、そして私が間隔を使用しているまで、サービスメソッド(HTTPポストメソッドを呼び出す)を繰り返し呼び出す必要があるシナリオを持っています。 以下のコードでは、getReportResultsList(id)メソッドが100ミリ秒の間隔で呼び出されます。angular2 observable interval - 順序外の応答を扱う

問題は、サーバーが最初の要求を処理して結果を返すのに300 msの時間がかかることです。しかし同時に、interval(100)のために結果を得るために2つ以上のリクエストがサーバーに送られます。だから、最初のリクエストから結果を得た後、予期せぬ2番目と3番目のリクエストのレスポンス結果を処理したくない。

私は2番目と3番目の回答を処理したくありません。これらのアウト・オブ・オーダー・レスポンスをどのように処理するかを知っている人はいますか?

ありがとうございました。

let subscriber = Observable.interval(100).subscribe(() => { 
        this.reportService.getReportResultList(id) 
        .subscribe(result => { 
        this.reportResults = result; 
        if (this.reportResults) { 
         this.prepareViewData(result); 
         subscriber.unsubscribe(); 
        } 
        }); 
       }); 
+0

私はこの種のことをするためにインターバルを使う必要はないと信じています。 いくつかのhttp呼び出しを行い、それを減らしたい場合は、次のリンクをチェックしてください:http://stackoverflow.com/questions/39395290/update-several-component-properties-with-a-single-http-呼び出しを使用するobservables 結果を得るためにあなたの呼び出しが完了するのを待つ必要があるので、obervablesを使うことは解決策でなければなりません。 –

+0

@AlexBeugnetは結果が出るまで反復的な呼び出しをする方法を提案することができます。ありがとう。 –

+0

あなたはどんな結果が期待されているのか、さらに詳しい情報が必要です。これは私にはまだ不明です: '問題は、サーバーが最初の要求を処理して結果を返すのに300 msの時間がかかることです。しかし、100ミリ秒後に同時に結果が得られるようにもう一度リクエストします。 前に示したリンクは、HTTPコールを行うコンポーネントがいくつかある場合の解決策です。これらのすべてのコンポーネントのデータを取得するための1つのHTTP呼び出し。私は誤解している可能性があります。 –

答えて

0

前述のコメント作成者の場合、使用するケースごとにサーバーを毎秒10回呼び出す必要はありません。実際に結果が得られるまでサーバーを呼び出すだけで済みます。

オブザーバブルのセマンティクスを使用するとより適切です。これらの線に沿って

何か:

this.reportService.getReportResultList(id) 
     .subscribe(result => { 
     this.reportResults = result; 
     if (!this.reportResults) { 
      throw 'empty'; 
     } 
     this.prepareViewData(result); 
     }) 
     .retryWhen((errors) => return errors.delay(10)); 

あなたは他のエラーが(例:HTTP 50xのエラーを)提起される可能性があるためretryWhenハンドラでもう少し徹底する必要がありますが、それはあなたのアイデアを与えるだろう。

+0

ありがとうございます。あなたはHTTPエラーを処理する方法を知っていますか? –

+0

HTTPエラーを処理する方法については、ここでAngular 2で知る必要がある情報がすべてあります:https://angular.io/docs/ts/latest/guide/server-communication.html#!#error-handling –

関連する問題