先来看下MDN关于该方法的定义:
Promise.all() 方法接收一个promise的iterable类型的入参,如果输入的所有promise都被resolve(fuifulled),那么将返回一个Promise<Array>实例;如果其中有任何一个promise被reject(rejected),那么将会返回该条错误信息。
模拟实现:
/** * 模拟Promise.all * @param {Array} promises - Promise数组 * @return {Promise} */ Promise._all = function(promises) { // 如果传入的不是可迭代对象 if (promises[Symbol.iterator] === undefined) { return Promise.reject('"promises" is not iterable (cannot read property Symbol(Symbol.iterator))'); } // 异步的完成结果容器 const fulfilledList = []; return new Promise((resolve, reject) => { // 使用for...of迭代promises for (const p of promises) { // 对promises数组中的元素进行Promise包裹,保证其为promise对象 Promise.resolve(p) .then(res => { // 异步状态顺利完成后,将结果推入容器 fulfilledList.push(res); // 如果元素数量与promises的容量相等就可以返回了 if (fulfilledList.length === promises.length) { resolve(fulfilledList); } }) // 任何一个元素出现失败状态则reject .catch(err => reject(err)); } }); }; //// 测试代码 ---- var p1 = 1; var p2 = new Promise(resolve => { window.setTimeout(() => { resolve('2'); }, 400); }); var p3 = Promise.resolve(3); Promise._all([p1, p2, p3]) .then(ans => { console.log(ans); }) .catch(err => { console.warn(err); });
end