不用说,肯定又是面试没写出来,我太fw了
思路
Promise.all 接收一个 Promise 实例的数组或具有 Iterator 接口的对象作为参数,这个方法返回一个新的 promise 对象
实现步骤:
- 首先我们能知道的是,Promise.all 返回一个Promise对象
- 定义一个counter计数传入的数组执行情况,resolve了就+1
- 定义一个result数组接收 resolve 传入的参数
- 循环遍历传入的数组,并用Promise.resolve( )包裹:
- 如果数组内不是promise对象,则也不会有影响,可以正常返回一个promise对象
- 如果数组内是promise对象,则链式调用,也不会有影响
- 传入数组参数所有回调成功才是成功,返回值数组与参数顺序一致
- 参数数组其中一个失败,则触发失败状态,第一个触发失败的 Promise 错误信息作为 Promise.all 的错误信息。
function promiseAll(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
throw new TypeError(`argument must be a array`)
}
let promiseNum = promises.length
let resolveCount = 0
let resolveResult = []
for (let i = 0; i < promiseNum; i++) {
//promises[i] 可能是普通值,不是promise对象
Promise.resolve(promises[i]).then(value => {
resolveCount++
resolveResult[i] = value
if (resolveCount === promiseNum) {
return resolve(resolveResult)
}
}, error => {
return reject(error)
})
}
})
}
// test
let p1 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(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)
})
promiseAll([p3, p1, p2]).then(res => {
console.log(res) // [3, 1, 2]
})