今天翻以前好久之前写的代码,突然发现一个当初由于对Promise了解不深导致的错误,并记录(奇怪的是我的Promise.any自我实现是正常的emmm)。
const myPromiseAll = (fnList) => {
return new Promise((resolve, reject) => {
const res = [];
const len = fnList.length;
let hasRejected = false;
let err = null;
let count = 0;
for (let i = 0; i < len; i++) {
Promise.resolve(fnList[i]).then((val) => {
res[i] = val
}).catch((val) => {
if (!hasRejected) {
hasRejected = true;
err = val;
}
}).finally(() => {
count++;
if (count === len) {
if (!hasRejected) {
resolve(res)
} else {
reject(err)
}
}
})
}
})
}
错误原因:promise.all并不是全部执行完后判断,而是在发生错误时直接返回reject。 原函数执行时: 打印顺序为:1000正确执行 > 2000错误执行 > 3000错误执行 > catch; 正确顺序应为 1000正确执行 > 2000错误执行 > catch > 3000错误执行。
const fn = (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (time < 2000) {
console.log(time + '正确执行');
resolve(time + '正确执行');
} else {
console.log(time + '发生错误');
reject(time + '发生错误');
}
}, time)
})
}
myPromiseAll([fn(1000), fn(2000), fn(3000)]).then(res => {
console.info('res')
}).catch(err => {
console.info('catch')
})
函数修改如下:
const myPromiseAll = (fnList) => {
return new Promise((resolve, reject) => {
const res = [];
const len = fnList.length;
let count = 0;
for (let i = 0; i < len; i++) {
Promise.resolve(fnList[i]).then((val) => {
res[i] = val
}).catch((err) => {
reject(err)
}).finally(() => {
count++;
if (count === len) {
resolve(res)
}
})
}
})
}