class Queue { static queue = [] static pendingPromise = false static stop = false static enqueue(promise) { return new Promise((resolve, reject) => { this.queue.push({ promise, resolve, reject }) this.dequeue() }) } static dequeue() { if (this.workingOnPromise) { return false } if (this.stop) { this.queue = [] this.stop = false return } const item = this.queue.shift() if (!item) { return false } try { this.workingOnPromise = true item .promise() .then((value) => { this.workingOnPromise = false item.resolve(value) this.dequeue() }) .catch((err) => { this.workingOnPromise = false item.reject(err) this.dequeue() }) } catch (err) { this.workingOnPromise = false item.reject(err) this.dequeue() } return true } } export default Queue