2016-09-28 6 views
0

Мне нужно создать блокирующую очередь в Javascript. Есть pop() и shift() методы в Array.prototype, но описание говорит:Блокировка очереди в Javascript

Возвращаемое значение: Последний элемент из массива; undefined, если массив пуст.

мне нужен метод, который делает не возвращения undefined, но ждет, пока не будет какой-то элемент, чтобы вернуться.

Цель состоит в том, что мой код управляется несколькими асинхронными операциями, которые толкают элементы в очередь, и мне нужно их обрабатывать.

+2

Вы должны пообещать –

+0

Как это отличается от потока событий? – Ven

+0

@YuriBlanc Почему вы хотите делать сложные вещи? – Ven

ответ

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); 
+0

Итак, в основном это буфер, не так ли? Вы отслеживаете «предварительно запрошенные» элементы в параметрах 'this.listeners' и« push, not request yet »в' this.queue'. – tomasbedrich

+1

что-то в этом роде. Я думаю, есть много библиотек, которые делают такие вещи лучше, чем мой код, пытаются что-то найти. Этот код является, например, только – Maxx

+0

Это должно действительно использовать 'push()' и 'shift()' так, чтобы он действовал как очередь, поскольку его имя подразумевает, а не стек. Слушатели тоже. – ccarton

Смежные вопросы