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)
})