2017-10-27 12 views
0

5秒ごとにforkJoinメソッドを繰り返します。 forkJoinが完了して結果を返すと、5秒タイマーが開始されます。 - 1 - - - 2 - - 3 - - 4 - - 5 - - 6角2は完了後5秒後にforkJoinを繰り返します。

0:

let getResult1 = this.myService.GetResult1(param1, param2);  // retrun Observable<Result1> 
     let getResult2 = this.myService.GetResult2(param1, param3,param4);// retrun Observable<Result2> 

     Observable.forkJoin(getResult1, getResult2) 
      .subscribe(results => { 
       this.result1 = results[0]; 
       this.result2 = results[1]; 
       .. start counting 5 seconds and then repeat this again and again 
      }, 
      error => this.handleError(error)); 

タイムラインは私がしたい:

時間(s)

これが私の現在のforkJoinです

アクション:Req - Res - - - - - - Req -...

待機: 5秒間待つ-------> |

答えて

0

これが最もエレガントな方法であるかどうかはわかりません。より多くのrxjs経験を持つ方がよりクリーンなソリューションを提供できるかもしれませんが、私の最初の考えは、Subjectを使用してforkJoinを呼び出すタイミングを決定することです。その後、別のリクエストを行うためにforkJoinの後にタイマーを追加するだけです。ここで

// component.ts 
subject$: Subject = new Subject(); 

ngOnInit(){ 
    this.subjectSubscription = this.subject$ 
     .flatMap(res => { 
      return Observable.forkJoin(
       this.dummy1$, // dummy observable api 
       this.dummy2$ // dummy observable api 
      ); 
     }) 
     .subscribe(res => { 
      // after 5 seconds, call subject.next to fire another forkJoin call 
      this.timerSubscription = Observable.timer(5000).subscribe(res => { 
       this.subject$.next(); 
      }) 

     }); 
    // make initial call 
    this.subject$.next(); 
} 

は、メモリリークに応答のための

+0

パーフェクト、これはまさに私が欲しいものです。多くのありがとうLLai。 – user662745

0

は、間隔、観察を使用します。

Observable.interval(5000) 
      .switchMap(t => 
       Observable.forkJoin(getResult1, getResult2)) 
      .subscribe(results => { 
      this.result1 = results[0]; 
      this.result2 = results[1]; 
      }, 
      error => this.handleError(error)); 

、これは必ずしも5秒完了した後、5秒ごとに要求を生成します。しかしそれは十分に近いはずです。正確に5秒間でなければならない場合は、別のアプローチが必要です。

+0

多くの感謝を避けるために、サブスクリプションのクリーンアップを含むデモplnkr(https://plnkr.co/edit/OaLIMxKKUqNXxcGp0HLW?p=preview)です。これは私が最初にしたものでしたが、問題はforkJoinの完了に5秒以上かかる可能性があり、外側のタイマーが最初の呼び出しの応答を受け取る前に次のラウンドAPIを呼び出し始めることです。 – user662745

+0

これは実際にはOKです。以前のものは、それがswitchmapの動作方法であるためキャンセルされ、未完了の前回の呼び出しをキャンセルします。 – bryan60

+0

多分、しかし、コンポーネントが破棄された後でさえ、APIが遅くなり、タイマーが加速していたときに、トラフィックの4〜5リクエストを取得していました。 – user662745

関連する問題