2016-03-01 33 views
8

Il mio caso d'uso è il seguente: Ottengo eventi, che a volte avvengono a raffiche. Se si verifica una raffica, ho solo bisogno di gestirlo una volta però. Rimbalzo fa questo.RXJS: rimbalzo aggregato

Tuttavia, il rimbalzo mi dà solo l'ultimo elemento di una raffica, ma ho bisogno di sapere su tutti gli elementi di una raffica da aggregare su di essi (usando la mappa piatta).

Questo potrebbe essere fatto da una finestra temporizzata o un buffer, tuttavia, questi sono intervalli fissi, quindi un timeout buffer/finestra potrebbe verificarsi nel mezzo di una raffica, quindi suddividere il burst in 2 parti da gestire invece di 1.

Quindi quello che avrei voluto è qualcosa di simile

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

sei riuscito a risolvere il tuo problema? – user3743222

+0

@ user3743222 La risposta di Matt Burnell funziona per me. –

risposta

11

Ciò può essere ottenuto con buffer facendo passare una corrente adattato dal come un selettore di chiusura, ad es .:

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)); 

Ecco una versione eseguibile: https://jsbin.com/wusasi/edit?js,console,output

+1

Ho dovuto apportare alcune modifiche per farlo funzionare in RxJS 5: http://jsbin.com/pubowum/2/edit?html,js,console,output –

+0

Aggiornamento: http://jsbin.com/pubowum/ 7/modificare? js, console, uscita –

-1

probabilmente siete alla ricerca di bufferWithTimeOrCount

dalla pagina:

/* 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

No, il buffer con count fa qualcosa di diverso, nel mio post iniziale ho spiegato perché il buffer non funziona, ed è lo stesso se si bufferizza con tempo, conteggio o entrambi. In breve: il buffer (e ogni variante) può emettere osservabili nel mezzo di una raffica. Questo è diverso da antirimbalzo, che emetterà solo dopo un periodo di tempo senza eventi in entrata. –