export type Job = () => Promise /** * A promise queue to running async functions serially */ export class Queue { isRunning = false private _queue: Job[] = [] async enqueue(cb: Job): Promise { let res = null as any let rej = null as any let p = new Promise((_res, _rej) => { res = _res rej = _rej }) this._queue.unshift(async () => { try { let ret = await cb() res(ret) return ret } catch (err) { rej(err) throw err } }) if (this.isRunning) return p this.isRunning = true ;(async () => { while (this._queue.length) { try { await this._queue.pop()!() } catch (error) { console.error(error) } } this.isRunning = false })() return p } }