Rx はSchedulers
(Rx.Scheduler
具体的にはインスタンス) の概念を使用します。このthrottle
メソッドは、使用するスケジューラであるオプションの 2 番目の引数を取ります。2 番目の引数を指定しない場合は、thenRx.Scheduler.timeout
が使用されます。このスケジューラーはsetTimeout
、将来のスケジュールを立てるために使用します。
あなたの例では、ドラッグイベントが発生するたびに、イベントthrottle
が保存され、それについて通知されないことを意味します。setTimeout
次に、イベントを通知するために、今から 400 ミリ秒後に (スケジューラーを介して、最終的には を介して) アクションをスケジュールします。drag
このタイムアウトが期限切れになる前に別のイベントが到着すると、タイムアウトがキャンセルされ、新しいイベントが開始されます。これはthrottle
、着信イベントが少なくとも 400 ミリ秒一時停止した場合にのみ通知されるためです。つまり、非常に速くドラッグしている場合、最終的にドラッグを遅くするまで、イベントは発生しません。
あなたの説明から判断すると、実際にはsample
の代わりに使用することを好むかもしれませんthrottle
。その間隔中にイベントが発生した場合、nSample
ミリ秒ごとにイベントを提供します。
Rx.Observable
.interval(500)
.sample(1500)
.take(5)
.subscribe(function (x) {
console.log('x: ' + x);
});
<script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'></script>
これにより、次の値が生成されます。
"x: 1"
"x: 4"
"x: 7"
"x: 10"
"x: 13"
ここで、各値は断続的な値の合計の平均です。つまり:
- (0 + 1 + 2) / 3 = 1
- (3 + 4 + 5) / 3 = 4
- ...
次のように使用します。
Rx.Observable
.fromEvent(element, 'drag')
.sample(400)
.subscribe(function (e) {
// ...
});