Еще один способ справиться с этим - написать собственный объект Queue, который удалял бы последний элемент из очереди, когда новый элемент был помещен в очередь, если общее количество элементов в очереди превышало ваши требования, и генерировал событие 'добавление элемента', которое другие части вашего приложения могут слушать.
Вот несколько примеров кода, в котором вы бы заменили ссылки на Array, length, shift () и unshift () на вызовы MongoDB:
var util=require('util'), // for inheritance
EventEmitter=require('events').EventEmitter, // for event handling
MaxQueueItems=10; // default total items in queue
var FixedSizeQueue=function(max){
this._storage=[]; // replace with call to MongoDB
this._max_items=max||MaxQueueItems;
};
util.inherits(FixedSizeQueue,EventEmitter); // now I can emit
FixedSizeQueue.prototype._add=function(item){ // private
// replace with call to MongoDB
this.emit('onItemAdd', this._storage.unshift(item), item);
};
FixedSizeQueue.prototype._remove=function(){ // private
// replace with call to MongoDB
var item=this._storage.shift();
if(item) {
this.emit('onItemRemove', this._storage.length, item);
return item;
}
};
FixedSizeQueue.prototype.enqueue=function(item){
if (this._storage.length+1 > this._max_items) {
this._remove();
}
this._add(item);
return(this); // for chaining
};
FixedSizeQueue.prototype.dequeue=function(){
return this._remove();
};
, который можно использовать как:
var q=new FixedSizeQueue(3); // a queue with only three items
q.on('onItemAdd',function(len,item){
console.log('item added, queue now contains '+len+' items.');
});
q.on('onItemRemove',function(len,item){
console.log('item removed, queue now contains '+len+' items.');
});
q.enqueue(1); // emits onItemAdd, queue = (1)
q.enqueue(2); // emits onItemAdd, queue = (2,1)
q.enqueue(3); // emits onItemAdd, queue = (3,2,1)
q.enqueue(1); // emits onItemRemove and onItemAdd, queue = (4,3,2)
вывод на консоль:
item added, queue now contains 1 items.
item added, queue now contains 2 items.
item added, queue now contains 3 items.
item removed, queue now contains 2 items.
item added, queue now contains 3 items.