async FIFO queue
by Arnaud Buchholz
JavaScript
function test (value, delay) {
return new Promise(resolve => {
setTimeout(() => {
console.log(value)
resolve(value)
}, delay)
})
}
const _queue = []
function done () {
_queue.shift()
}
function queue (fn, ...params) {
let promise
if (!_queue.length) {
promise = fn(...params)
} else {
promise = _queue.last.then(() => fn(...params))
}
_queue.last = promise.then(done,done)
_queue.push(queue.last)
return promise
}
queue(test, 1, 150).then('OK1')
console.log(`count: ${_queue.length}`)
queue(test, 2, 100).then('OK2')
console.log(`count: ${_queue.length}`)
_queue.last.then(() => {
console.log(`count: ${_queue.length}`)
console.log(3)
console.log(_queue.last)
})