Задача: Вручную реализовать один
promise.all
Шаг 1: Наблюдайте
promise.all
специальность:
- Вход - это
Promise
массив экземпляров - Возвращаемое значение представляет собой
promise
, потому что вы можете использовать.then
- Если все успешно, статус меняется на
resolved
, а возвращаемое значение образует массив и передается обратному вызову - В случае сбоя статус меняется на
rejected
, и воляerror
вернуться к обратному вызову
Шаг 2: Реализация кода
function diPromiseAll(promises){
return new Promise((resolve, reject)=>{
// 参数判断
if(!Array.isArray(promises)){
throw new TypeError("promises must be an array")
}
let result = [] // 存放结果
let count = 0 // 记录有几个resolved
promises.forEach((promise, index) => {
promise.then((res)=>{
result[index] = res
count++
count === promises.length && resolve(result) // 判断是否已经完成
}, (err)=>{
reject(err)
})
})
})
}
Шаг 3. Подтвердите
let p1 = Promise.resolve(1),
p2 = Promise.resolve(2),
p3 = Promise.resolve(3);
diPromiseAll([p1, p2, p3]).then((res)=>{
console.log(res, 'res')
}, (err)=>{
console.log(err, 'err')
})
// [1, 2, 3]
let p1 = Promise.reject(1),
p2 = Promise.resolve(2),
p3 = Promise.resolve(3);
diPromiseAll([p1, p2, p3]).then((res)=>{
console.log(res, 'res')
}, (err)=>{
console.log(err, 'err')
})
// 1 "err"