4

イベントの継続的なソース (要素のドラッグ) で特定のことが発生した場合のシナリオを実装したいと思いますが、いくつかのバッファリング/スロットリングがあります。通知を受け取りたいのですが

  • 400ミリ秒ごと
  • ただし、ソースに新しいアイテムがあった場合のみ (ドラッグが実際に発生)

以下に概要を示すスロットル オペレータを使用した私の最も近いアイデアは、400 ミリ秒の一時停止を待ってからシーケンスを提供するだけです。連続ドラッグの値は提供しません。

Rx.Observable
      .fromEvent(element, "drag")
      .throttle(400);

タイマーのソースが必要になると思いますが、その場合、タイマー ソースとドラッグ ソースを前述の条件と組み合わせるにはどうすればよいでしょうか。

4

1 に答える 1

8

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) {
        // ...
    });
于 2013-04-28T21:18:39.630 に答える