刚刚被大佬吐槽了,改了下代码,确实在实现上欠考虑...
思路:从Promise.all本身的用法入手
1.传入一个promise的数组,返回一个新的promise,当所有给定的promise都被处理并最终以数组的形式呈现其结果时,新的promise也就被resolve了
2.返回的顺序与传入promise的顺序一致,即使第一个promise需要很长的时间来resolve,但它仍然是结果数组中的第一个
实现:
// Promise.all
function all(promises) {
let len = promises.length, res = []
if (len) {
return new Promise(function (resolve, reject) {
for(let i=0; i<len; i++) {
let promise = promises[i];
promise.then(response => {
res[i] = response
// 当返回结果为最后一个时
if (res.length === len) {
resolve(res)
}
}, error => {
reject(error)
})
}
})
}
}
// test
let p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(1)
// reject(new Error('error 1'))
}, 1000)
})
let p2 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(2)
}, 2000)
})
let p3 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(3)
}, 3000)
})
all([p1, p2, p3]).then(res => {
console.log(res) // [1, 2, 3]
}).catch(console.log)