import * as Q from 'q'; export default class PromisedQueue { private queue: Array> = []; private list: Array = []; public enqueue(item: T): void { const d = this.queue.shift(); if (d) { return d.resolve(item); } this.list.push(item); } public async dequeue(): Promise { const item = this.list.shift(); if (item) { return item; } const d = Q.defer(); this.queue.push(d); return d.promise; } }