我需要在Javascript中创建一个阻塞队列。 Array.prototype中有pop()
和shift()
个方法,但描述说明了:
返回值:数组中的最后一个元素;如果数组为空,则
undefined
。
我需要一个不返回undefined
的方法,但要等到有一些要返回的元素。
目的是,我的代码由多个异步操作驱动,这些操作将元素推送到队列中,我需要处理它们。
答案 0 :(得分:3)
使用推移的简单实现
function Queue() {
this.listeners = [];
this.queue = [];
}
Queue.prototype = {
shift: function(cb) {
this.queue.length > 0 ? cb(this.queue.shift()) : this.listeners.push(cb);
},
push: function(value) {
if (this.listeners.length > 0) {
this.listeners.shift()(value);
return;
}
this.queue.push(value);
}
}
var queue = new Queue();
// 'some value'
queue.shift(function(value) { console.log(value); });
setTimeout(function() {
queue.push('some value');
queue.push('another value');
// 'another value'
queue.shift(function(value){ console.log(value); });
}, 3000);