2016-09-02 8 views
2

den folgenden Code gegeben, wo ich bufferCount (nicht ganz das, was ich will) verwenden ...Wie macht man einen Gleitpuffer-Stream?

var Rx = require('rxjs/Rx'); 
    var Observable = Rx.Observable; 
    var Subject = Rx.Subject; 

    var first = new Rx.Subject(); 

    var source = first.bufferCount(2).map(a => a.reduce((acc,x) => acc+x,0)); 

    var subscription = source.subscribe(console.log) 

    first.next(1) 
    first.next(2) 
    first.next(2) 
    first.next(3) 

I

3 
5 

bekommen, was ich

ist
3 
4 
5 
bekommen möchten

, so dass der Puffer die letzten 2 Elemente puffert.

Gibt es eine Möglichkeit, dies einfach zu tun?

Antwort

1

Haben Sie versucht, bufferCount 's skip/startBufferEvery Parameter zu verwenden? Auf diese Weise können Sie überlappende Puffer generieren, die Sie dann beliebig reduzieren können. Auf diese Weise werden keine Werte ausgegeben, die Sie anschließend herausfiltern müssen. Wenn Sie speziell eine Puffergröße von 2 wünschen, können Sie pairwise anstelle von bufferCount verwenden.

Keith: - Der Code mit dieser Methode

var Rx = require('rxjs/Rx'); 
var Observable = Rx.Observable; 
var Subject = Rx.Subject; 

var first = new Rx.Subject(); 

var source = first.bufferCount(2,1).map(a => a.reduce((acc,x) => acc+x,0)); 

var subscription = source.subscribe(console.log) 

first.next(1) 
first.next(2) 
first.next(2) 
first.next(3) 
+0

schön, ich habe diesen hinterhältigen Parameter nicht bemerkt –

3

Verwenden Sie den Operator scan, um den Gleitpuffer zu halten und die Operation auszuführen. Zum Beispiel:

var source = first.scan((slidingBuffer, newInput) => { 
    return addTo(slidingBuffer, newInput) 
    }, []) 
    .map(processBuffer) 

mit den addTo und processBuffer Funktionen offensichtliche Bedeutung haben.

+0

ist es eine Möglichkeit, von der Untersuchung zurückzukehren, ohne irgendetwas in den Strom emiting, für den ersten Fall, in dem der Schiebepuffer nicht voll ist? –

+0

geben Sie einfach false zurück, und filtern Sie falsche Werte aus, oder kümmern Sie sich um diesen Fall in der processBuffer-Funktion – user3743222

+0

yeah, gerade erkannt, ich kann es filtern –