'use strict'; const { AigleProxy } = require('aigle-core'); const Aigle = require('./aigle'); const { INTERNAL, PENDING, iteratorSymbol, promiseArrayEach, promiseSetEach } = require('./internal/util'); const { callResolve } = require('./props'); class All extends AigleProxy { constructor(coll) { super(); this._promise = new Aigle(INTERNAL); this._rest = undefined; this._result = undefined; if (coll === PENDING) { this._callResolve = this._set; } else { this._callResolve = undefined; this._set(coll); } } _set(coll) { if (Array.isArray(coll)) { const size = coll.length; this._rest = size; this._result = Array(size); this._callResolve = callResolve; promiseArrayEach(this, size, coll); } else if (coll[iteratorSymbol]) { const { size } = coll; this._rest = size; this._result = Array(size); this._callResolve = callResolve; promiseSetEach(this, Infinity, coll); } else { this._rest = 0; this._result = []; } if (this._rest === 0) { this._promise._resolve(this._result); } return this; } _execute() { return this._promise; } _callReject(reason) { this._promise._reject(reason); } } module.exports = { all, All }; /** * `Aigle.all` is almost the same functionality as `Promise.all`. * It will return an Aigle instance. * @param {Array} array * @return {Aigle} Returns an Aigle instance * @example * const order = []; * const makeDelay = (num, delay) => { * return Aigle.delay(delay) * .then(() => { * order.push(num); * return num; * }); * }; * Aigle.all([ * makeDelay(1, 30), * makeDelay(2, 20), * makeDelay(3, 10) * ]) * .then(array => { * console.log(array); // [1, 2, 3]; * console.log(order); // [3, 2, 1]; * }); */ function all(array) { return new All(array)._promise; }