Home Reference Source Repository

src/component/helper/sequential-promise.js

'use strict';

/**
 * Implements Promise.all() but sequential execution
 */
class SequentialPromise {
  /**
   * @param {function[]} promises
   * @param {*} value
   * 
   * @returns {Promise}
   */
  static all(promises, value = null) {
    const promisesCloned = [].concat(promises);
    
    return this._sequential(promisesCloned, value);
  }
  
  /**
   * @param {function[]} promises
   * @param {*} result
   * 
   * @returns {Promise}
   *
   * @private
   */
  static _sequential(promises, result) {
    if (promises.length <= 0) {
      return Promise.resolve(result);
    }
    
    return promises.shift()(result)
      .then(result => SequentialPromise._sequential(promises, result));
  }
}

module.exports = SequentialPromise;