function PromiseAll(promiseArray) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promiseArray)) {
return reject(new Error('传入的参数必须是数组!'));
}
const res = [];
let count = 0;
const promiseNums = promiseArray.length;
for (let i = 0; i < promiseNums; i++) {
// 不推荐
// const isPromise = Object.prototype.toString().toLocaleLowerCase(promiseArray[i]) === '[object Promise]';
// if (isPromise) {
// promiseArray[i].then(result => {
// res.push(result);
// })
// } else {
// res.push(promiseArray[i]);
// }
// 忽略promise.all的执行顺序
// Promise.resolve((promiseArray[i])).then(value => {
// res.push(value);
// if (res.length === promiseNums) {
// resolve(res);
// }
// })
Promise.resolve(promiseArray[i]).then(value => {
count++;
res[i] = value;
// 不能用res.length判断,原因:
// let arr = [];
// arr[6] = 3;
// arr.length = 7
if (count === promiseNums) {
resolve(res);
}
}).catch(e => reject(e));
}
})
}
// test
const pro1 = new Promise((res, rej) => {
setTimeout(() => {
res('1');
}, 1000)
})
const pro2 = new Promise((res, rej) => {
setTimeout(() => {
res('2');
}, 2000)
})
const pro3 = new Promise((res, rej) => {
setTimeout(() => {
res('3');
}, 3000)
})
const proAll = PromiseAll([pro1, pro2, pro3])
.then(res => console.log(res))
.catch((e) => console.log(e));