| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | "use strict";var _promiseUtils = require("./promiseUtils");/** * @flow *//*:: type Task = {  task: () => Promise,  _completion: Promise,};*/class TaskQueue {  /*:: queue: Array<Task>;*/  constructor() {    this.queue = [];  }  enqueue(task /*: () => Promise*/) /*: Promise*/{    const taskComplete = new _promiseUtils.resolvingPromise();    this.queue.push({      task: task,      _completion: taskComplete    });    if (this.queue.length === 1) {      task().then(() => {        this._dequeue();        taskComplete.resolve();      }, error => {        this._dequeue();        taskComplete.reject(error);      });    }    return taskComplete;  }  _dequeue() {    this.queue.shift();    if (this.queue.length) {      const next = this.queue[0];      next.task().then(() => {        this._dequeue();        next._completion.resolve();      }, error => {        this._dequeue();        next._completion.reject(error);      });    }  }}module.exports = TaskQueue;
 |