[英]How to catch a rejected promise in a new expression node v14.4.0 “for await … of”
我模拟了 3 个承诺 - 两个已解决,一个被拒绝,包装了一个 try-catch function,但我仍然在控制台中收到警告:(节点:4159)UnhandledPromiseRejectionWarning:Unhandled89DEEBZF795D279。
const emulate = (id, ms) =>
new Promise((resolve, reject) => {
if (ms > 1500) reject(id);
setTimeout(() => {
resolve(id);
}, ms);
});
const promises = [
emulate(1, 500),
emulate(2, 1000),
emulate(3, 2000)
];
async function stepByStepResolve() {
try {
for await (const promise of promises)
console.log(promise);
} catch (e) {
console.log('Err:', e);
}
}
stepByStepResolve();
当您在promises
数组中调用 emulate emulate(3, 2000)
时,会创建一个 promise,并且会在事件循环的下一阶段被拒绝,除非您在此之前正在收听并处理它。 现在,在for loop
中,您正在按顺序收听所有 3 个 Promise,并且由于emulate(3, 2000)
是最后收听的,因此在您迭代它时它已经被拒绝了。
我可以为此提出两种解决方案:
解决方案 1 :只需将emulate(3, 2000)
作为数组中的第一个元素
let promises = [
emulate(3, 2000),
emulate(1, 500),
emulate(2, 1000),
];
这将允许它被倾听,并在它被拒绝之前被捕获。
解决方案 2 (这更像是一个建议):使用生成器而不是数组,如下所示:
function* promisesGenerator() {
yield emulate(3, 2000);
yield emulate(1, 500);
yield emulate(2, 1000);
}
async function stepByStepResolve() {
try {
for await (const promise of promisesGenerator())
console.log(promise);
} catch (e) {
console.log('Err:', e);
}
}
stepByStepResolve();
这将防止在for loop
之前创建 Promise,并在您遍历生成器时一一创建。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.