2017-12-01 16 views
2

同じAPIのループでリクエストをいくつか実行しています。サーバー側では、以前の結果を確認して変更を加える必要があります。しかし、リクエストが1つ以上ループしている場合は、前の結果を見ることはできません。コンポーネントでhttpリクエストを送信する前の角2遅延

this.service.createEmail(...).delay(5000).debounceTime(5000).timeout(5000).subscribe(...); 

とサービスで:

createEmail(...): Observable<Json> { 
    return this.http 
      .post('url', 
       JSON.stringify(model), 
       { headers: this.headers }) 
      .delay(5000).debounceTime(5000).timeout(5000) 
      .map((response: Response) => { 
       return this.responseService.extractData(response); 
      }) 
      .catch(error => { 
       return this.errorService.handleError(error); 
      }); 
     } 

は私を助けていません。 必要なインポートが存在します。 ちょうどjs setIntervalが私を助けました。

他の方法でhttpリクエストの前に遅延を行うにはどうすればよいですか?あなたはdebounceTimeと別のRX演算子を追加することができますswitchMap前

createEmail(...): Observable<Json> { 
    return Observable 
      .timer(5000) 
      .switchMap(() => 
       this.http.post(
        'url', 
        JSON.stringify(model), 
        {headers: this.headers} 
       ) 
      ) 
      .map((response: Response) => { 
       return this.responseService.extractData(response); 
      }) 
      .catch(error => { 
       return this.errorService.handleError(error); 
      }); 
} 

+0

あなたは 'setTimeout(()=> {..}、5000)'を試しましたか?多分それは助けるかもしれない –

+0

はい、私は試しました、それはまた私を助けなかった。 –

+1

問題はループ内でリクエストを作成していることです。ループはタイムアウトを待つことなくほぼすべての要求を同時に発生させようとします。デバウンスは、最後のリクエストだけが起動されるようにします。なぜなら、あなたは1つ以上の応答を見ることができないのです。ループを完全に削除し、concatMapで観察可能な連鎖を使用すれば動作します。 – Alex

答えて

0

あなたはswitchMap、タイマーを使用することができます。

私はより多くの情報を持っているswitchMapのドキュメントをチェックすることを勧めます:https://www.learnrxjs.io/operators/transformation/switchmap.html

すぐに観察した結果を配信したくないときは、.delayを使用することができます。たとえば、APIの応答の遅延をシミュレートする場合に使用します。

+0

Unfortunatellyあなたの例が私のために働いていない –

+0

@ A.Gladkiyあなたはエラーがありますか? – mickaelw

+0

いいえ、単にリクエストはサーバーに送られません –

関連する問題