如何做滑动缓冲流?

时间:2016-09-02 02:27:56

标签: javascript node.js rxjs

给出以下代码,我使用bufferCount(不是我想要的)...

   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)

我得到了

3
5

我想要得到的是

3
4
5

所以缓冲区正在缓冲最后两项。

有没有办法简单地做到这一点?

2 个答案:

答案 0 :(得分:3)

使用scan运算符来保存滑动缓冲区,并对其执行操作。例如:

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

addToprocessBuffer函数具有明显的含义。

答案 1 :(得分:1)

您是否尝试过使用bufferCount的{​​{1}} / skip参数?这允许您生成重叠缓冲区,然后您可以根据需要减少缓冲区。这种方式不涉及发射您必须随后过滤掉的值。如果您特别希望缓冲区大小为2,则可以使用startBufferEvery而不是bufferCount。

Keith: - 使用此方法的代码

pairwise