gpt4 book ai didi

node.js - 为什么此示例会抛出 UnhandledPromiseRejectionWarning?

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:39 24 4
gpt4 key购买 nike

NodeJS 版本 8.11 - 警告是“此错误是由于在没有 catch block 的情况下抛出异步函数内部,或者拒绝未使用 .catch() 处理的 promise 而引起的。”

这些都不是真的,您可以通过检查我的测试用例来看到:

const DEMONSTRATE_FAILURE = false

async function doPromises() {
try {
if (DEMONSTRATE_FAILURE) {
// This causes UnhandledPromiseRejectionWarning warnings:

const brokenPromises = [createPromises(), createPromises()]

await brokenPromises[0]
await brokenPromises[1]

} else {
// This works fine:
await createPromises()
await createPromises()
}
} catch(err) {
process.stdout.write("x")
}
}

// Create 10 promises, of which 50% will reject after between 0 and 1000ms
function createPromises() {
let badPromises = []
for (let x = 0; x < 10; x++) {
badPromises.push(new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
process.stdout.write("-")
reject("rejected!")
} else {
process.stdout.write("+")
resolve()
}
}, Math.round(Math.random() * 1000))
}))
}

return Promise.all(badPromises)
}


(async function main() {
while (true) {
await doPromises()
}
})()

翻转DEMONSTRATE_FAILURE标记以查看运行时有错误和没有错误的相同代码。

最佳答案

问题是,一旦 awaitPromise拒绝,抛出错误,代码从 await brokenPromises[0] 移出try 内的行到catch 。所以, brokenPromises[0] 抛出的错误现已被妥善抓获。但是,被拒绝了PromisebrokenPromises[1]尚未处理!尚未! (如果 try block 已经通过 [0] 并到达 [1] ,那么 await brokenPromises[0] 就会抛出一个本来可以被捕获的错误,但是解释器不知道)

这是一个更小的示例,说明了您原来的问题(打开浏览器控制台以查看拒绝,它在 Stack Snippet 控制台中不可见):

const makeProm = () => new Promise((_, reject) => setTimeout(reject, 500));

console.log('will be uncaught:');
// Unhandled rejection:
(async () => {
try {
const proms = [makeProm(), makeProm()];
await proms[0];
await proms[1];
} catch(e){}
})();

// Works:
setTimeout(async () => {
console.log('going to be caught:');
try {
await makeProm();
await makeProm();
} catch(e){ console.log('caught'); }
}, 1000);

您可以通过 await 修复它正在寻找Promise.all两者 Promise s,而不是 await每个 Promise分别 - 这样,当 Promise.all抛出,均被拒绝 Promise链已处理。

更改 process.stdout.write发送至console.log在这里,以便可以在可运行的代码片段中说明修复:

const DEMONSTRATE_FAILURE = true;

async function doPromises() {
try {
if (DEMONSTRATE_FAILURE) {
// This causes UnhandledPromiseRejectionWarning warnings:

const brokenPromises = [createPromises(), createPromises()]
await Promise.all(brokenPromises);

} else {
// This works fine:
await createPromises()
await createPromises()
}
} catch (err) {
console.log("x")
}
}

// Create 10 promises, of which 50% will reject after between 0 and 1000ms
function createPromises() {
let badPromises = []
for (let x = 0; x < 10; x++) {
badPromises.push(new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
console.log("-")
reject("rejected!")
} else {
console.log("+")
resolve()
}
}, Math.round(Math.random() * 1000))
}))
}

return Promise.all(badPromises)
}


(async function main() {
await doPromises()
})()

关于node.js - 为什么此示例会抛出 UnhandledPromiseRejectionWarning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com