你所描述的是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);
這種方法也比較effecient,因爲你只創建一個可觀察的,而不是按每個項目一個新的可觀測。
如果你想推廣的辦法,你可以創建一個操作:
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]);
});
};
非常感謝。正是我需要的 – apolenur