你所描述的是bufferWithCount
。实际上,windowWithCount
立即产生一个可观察对象,并且该可观察对象将立即开始产生它的项目。据推测,您正在toArray
某处进行(或类似的事情),这迫使窗口在产生它的项目之前完成。这很可能是因为您在尝试绘制图像之前尝试同步所有点。相反,您应该在事件发生时使用它们。然而,如果你这样做,你最终会得到重复的绘制,因为窗口肯定会重叠。
实际上,您可能想要的是更像scan
...
var Rx = require('rx'),
Observable = Rx.Observable,
log = console.log.bind(console),
source = Observable.interval(25),
points = source.scan([], function (acc, point) {
if (acc.length === 50) {
// Remove the last item
acc.shift();
}
// Add the next item
acc.push(point);
return acc;
}),
subscription = points.subscribe(log);
这种方法也更有效,因为您只创建一个可观察对象,而不是每个项目创建一个新的可观察对象。
如果您想概括该方法,您可以创建一个运算符:
Rx.Observable.prototype.rollingBuffer = function (count) {
return this.scan([], function (acc, point) {
var length = acc.length,
start = (length >= count)
? (length - count + 1)
: 0;
return acc
.slice(start)
.concat([point]);
});
};