2016-03-01 12 views
8

私のユースケースは以下の通りです:私はときどきバースト的に発生するイベントを受け取ります。バーストが発生した場合、私は一度だけそれを処理する必要があります。 Debounceがこれを行います。RXJS:集約デバウンス

しかし、debounceは私にバーストの最後の要素を与えますが、バースト内のすべての要素について(フラットマップを使用して)集約する必要があります。

これはタイムドウインドウまたはバッファで行うことができますが、これらは固定間隔なので、バーストの途中でバッファ/ウィンドウタイムアウトが発生する可能性があるため、バーストを2つに分割して1の代わりに処理します。

だから、あなたは、おそらくページからbufferWithTimeOrCount

探しているものを私がしたいと思うことは

. 
. 
event: a 
. 
. -> a 
. 
. 
. 
. 
. 
.event: b 
.event: c 
.event: d 
. 
.-> b,c,d 
. 
. 
. 
. 
.event : e 
. 
. -> e 
. 
+0

はあなたの問題を解決するために管理したのは? – user3743222

+0

@ user3743222 Matt burnellの答えは私のために働いています。 –

答えて

11

これは、例えば、クロージングセレクタとしてでデバウンスストリームを渡すことによってbufferで達成することができます。:

var s = Rx.Observable.of('a') 
    .merge(Rx.Observable.of('b').delay(100)) 
    .merge(Rx.Observable.of('c').delay(150)) 
    .merge(Rx.Observable.of('d').delay(200)) 
    .merge(Rx.Observable.of('e').delay(300)) 
    .share() 
; 

s.buffer(s.debounce(75)).subscribe(x => console.log(x)); 

ここで実行可能なバージョンです:https://jsbin.com/wusasi/edit?js,console,output

+1

これをRxJS 5で動作させるためにいくつかの変更が必要でした:http://jsbin.com/pubowum/2/edit?html,js,console,output –

+0

アップデート:http://jsbin.com/pubowum/ 7 /編集?js、コンソール、出力 –

-1

のようなものです:

/* Hitting the count buffer first */ 
var source = Rx.Observable.interval(100) 
    .bufferWithTimeOrCount(500, 3) 
    .take(3); 

var subscription = source.subscribe(
    function (x) { 
     console.log('Next: ' + x.toString()); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

// => Next: 0,1,2 
// => Next: 3,4,5 
// => Next: 6,7,8 
// => Completed 
+0

いいえ、countを持つバッファは何か違うのですが、最初の投稿ではなぜバッファが動作しないのか説明しました。時間、数、またはその両方でバッファすると同じです。要するに、バッファ(および各バリアント)は、バーストの途中でオブザーバブルを放出することができます。これは、デバウンスとは異なります。デバウンスは、着信イベントなしで一定時間後にのみ発光します。 –