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) {
// ...
});