首先我们要知道Promise.all()方法的用处以及场景。
1.保证传入的是一个数组,传入的是数组但是为空数组怎么办
2.数组中的项是promise怎么办,不是promise怎么办
3.当所有的项都完成之后,返回一个新的promise实例,该实例的状态为fulfilled,成功的结果为 所有项的结果组成的一个数组。
4.当任意一个项被拒绝之后,返回的promise的实例的状态为 rejected,失败的原因为 失败的项的原因
下面看代码:
function promiseAll(promises) { return new Promise((resolve, reject) => { //首先判断 传入的promises是否是一个数组,如果不是直接返回 if (!Array.isArray(promises)) { return reject(new TypeError('参数必须是一个数组')); } let results = []; //存放每个promise结果的空数组 let count = 0; //计数器,已经循环几个了 if (promises.length === 0) { return resolve(results); //如果传入的是空数组,直接返回成功的结果 为[] } //循环数组中的每一项 for (let i = 0; i < promises.length; i++) { let promiseDemo = promises[i]; //判断这一项是否为Promise的实例,如果不是则直接将它作为一个成功状态的promise对象 if (!(promiseDemo instanceof Promise)) { promiseDemo = Promise.resolve(promiseDemo) } promiseDemo.then((result) => { results[i] = result; count++; //如果计数器==传入数组的长度说明已经循环完毕且状态都为成功,使用 resolve(results),将存储结果的数组返回 if (count === promises.length) { resolve(results); } }).catch((error) => { //只要有一个状态为失败直接返回 reject('error'); return }); } }); }