promiseAll 函数中的块 catch(err){} 不会捕获错误。
const promiseAll = async (promises) => {
const result = [];
try {
for await (let element of promises) {
result.push(element);
}
} catch (err) {
throw err;
}
return result;
};
const result = promiseAll([
Promise.resolve(1),
new Promise((resolve) => {
setTimeout(() => {
resolve(3);
}, 3000);
}),
Promise.resolve(2),
Promise.reject(2),
new Promise((resolve) => {
setTimeout(() => {
resolve(3);
}, 1000);
}),
]);
result
.then((data) => console.log("Data", data))
.catch((err) => console.log("err", err));
promiseAll 函数中的块 catch(err){} 不会捕获错误。 对我来说有趣的是为什么我无法捕获块捕获中的错误。解决办法是什么?
因为您没有将任何错误处理
catch
回调附加到您的错误,并且您允许触发额外的事件循环(刻度),Chrome 会将其视为未经处理的错误。
一种解决方案是在
catch
之前简单地将 await
回调附加到所有元素。
下面的示例,唯一的缺点是它只会报告它找到的第一个错误,但如果需要,您也可以处理该问题。
const promiseAll = async (promises) => {
const result = [];
//were awaiting promises, let attach dummy catch
//so that next tick doesn't detect error as unhandled.
for (let element of promises) element.catch(e => {});
//Don't worry the error we just swallowed above
//will resurface during the await
for (let element of promises) {
result.push(await element);
}
return result;
};
const result = promiseAll([
Promise.resolve(1),
new Promise((resolve) => {
setTimeout(() => {
resolve(3);
}, 3000);
}),
Promise.resolve(2),
Promise.reject(2),
new Promise((resolve) => {
setTimeout(() => {
resolve(3);
}, 1000);
}),
]);
result
.then((data) => console.log("Data", data))
.catch((err) => console.log("err", err));