2016-05-19 2 views
4

RxJS-DOMを使用してmousewheelイベントを監視したいので、最初のイベントが発生したときにそれを転送してから、後続の値の間の遅延が以前に指定された値期間。送信された値が数値であり、時間はどのくらい説明どこRxJSが最初にスロットルして待機する

0 - (200 ms) - 1 - (400ms) - 2 - (600ms) - 3 

:次のデータ・ストリームを想像してみて

Rx.DOM.fromEvent(window, 'mousewheel', (e) => e.deltaY) 
.timegate(500 /* ms */) 

私が想像してるオペレータは、次のようになります次の値が到着します。後続の値間の個々の遅延が500msより大きくないため、0が最初の値であるため、出力され、3までのすべての値が削除されます。

スロットルとは異なり、最後の受信値が放出されたかどうかにかかわらず、値間の時間遅延が計算されます。最後に放出された値(0)と現在受信された値(2)との間の時間が経過するので、スロットルで0が送信され、200msが経過し、1が評価され、失敗し、400msが経過し、2が評価され、 )は600msですが、私のオペレータでは1と比較して評価され、時間経過は400msとなり、テストに失敗します。

また、この演算子はデバウンスもしません。インターバルが経過するまで待つのではなく、まず最初の値を送信し、その後のすべての値に対して評価します。

このような演算子は既に存在しますか?もしそうでなければ、私はどのようにして一つにするつもりですか?

+0

/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md)。 –

+0

いいえ、debounceは時間間隔の後に値を送信します。値を送信してから、最初の値が送信された後の期間を超えないすべての値を削除します。 – barndog

+0

文書から:Observableが他の項目を省略しないで、特定のタイムスパンが過ぎた後、Observableソースから項目を放出します。 - または - 観測可能なシーケンスの値の後に、計算されたデバウンス期間内の別の値が無視されます。 – barndog

答えて

3

これは、連続値間の時間間隔を正確に計算するtimeInterval演算子を使用して比較的簡単に実行できます。ここでは、あなたの見た目に適応することができるサンプルコードです。

http://jsfiddle.net/a7uusL6t/

var Xms = 500; 
var click$ = Rx.Observable.fromEvent(document, 'click').timeInterval() 
var firstClick$ = click$.first().map(function(x){return x.value}); 

var res$ = firstClick$ 
    .concat(click$ 
    .filter(function (x) { 
     console.log('interval', x.interval); 
     return x.interval > Xms;}) 
    .map(function(x){return x.value}) 
    ); 

res$.subscribe(function(x){console.log(x)}) 
1

私は@ user3743222の答えよりも洗練された類似したものと私の問題を解決しますが:私はあなたが[デバウンス](https://github.comを探していると信じて

const events = Rx.Observable.fromEvent(window, 'mousewheel', (e) => e.deltaY); 
const firstEventObservable = events.take(1); 
const remainingEventsObservable = events.skip(1) 
    .timeInterval() 
    .filter(x => x.interval >= this.props.delayDuration) 
    .map(x => x.value); 
const pageChangeObservable = firstEventObservable.concat(remainingEventsObservable); 
+0

さらに洗練された意味で?私はそれほど大きな違いはありません。 'concat'がすでにそれをしているので' skip'を使う必要はありません。それ以外は、それはすべて同じです – user3743222

+1

私はより読みやすいことを意味します。 – barndog

関連する問題