2016-10-17 7 views
2

自動受信機Observableを購読するときにx秒ごとにAPIにクエリを行い、最後に要求が完了したことを確認します。Rxjs:X秒ごとにAjax呼び出しを繰り返しますが、最後のものを完了するのを待ちます。

let autoRefresher = new Observable().exhaustMap(() => Observable.defer(() => { 
    return someService.returningAPromise(); 
}).timeout(refreshIntervalInMs).repeat()); 

これを行うより良い方法はありますか?毎回新しい観測値を作成せずに更新間隔を更新するにはどうすればよいですか?

答えて

5

私はこのようにそれを行うだろう:http://plnkr.co/edit/7HAib10r6Vdl1x2U2wFS

これは、ランダムに3秒の遅延を作る:

import {Observable} from 'rxjs'; 

function doRequest() { 
    if (Math.random() < 0.25) { 
    return Observable.of('HTTP Response').delay(3000); 
    } else { 
    return Observable.of('HTTP Response'); 
    } 
} 

let autoRefresher = Observable.timer(0, 1000) 
    .exhaustMap(doRequest) 
    .subscribe(response => { 
    console.log(response); 
    }); 

がライブデモを参照してください。オペレータ timer()は定期的に値を発行します。次に exhaustMap()は、前のObservableにサブスクライブし、現在のObservableが完了するまで、Observableをすべて無視します。したがって timer()は値を出力していますが、これは exhaust()によって無視されます。

Btw、私はTypeScriptを使用しています。

+0

ニースは、私が思ったよりも簡単です。興味のないところでは、Math.random()は何ですか? – sqwk

+0

@sqwkこれは、重複する要求をシミュレートするためだけです。 – martin

関連する問題