[英]How to use single catch function for nested async await?
我有以下代码:
on('connection', async(socket) => {
try {
const promises = members.map(async(member) => {
try {
const users = await User.find({})
const _promises = users.map(async() => {
try {
//some code here
} catch (err) {
console.log(err)
}
})
await Promise.all(_promises)
} catch (err) {
console.log(err)
}
})
await Promise.all(promises)
} catch (err) {
console.log(err)
throw err
}
})
正如你可以看到我有一个try
catch
每一个嵌套的async
功能。 可以对代码进行调整以仅使用单个catch
还是以某种方式简化操作?
您只能在处理程序的顶层await
一次。 如果在其中产生的Promises都链接到一个在顶层await
的Promise(如您的示例中所示),则该顶层await
将捕获在内部任何地方抛出的错误。
但是,你catch
节不应该throw
,除非另一个错误.on
处理无极拒绝为好,否则你会得到一个未处理的承诺拒绝:
on('connection', async(socket) => {
try {
const promises = members.map(async(member) => {
const users = await User.find({})
const _promises = users.map(async() => {
//some code here which may throw
});
await Promise.all(_promises);
});
await Promise.all(promises);
} catch (err) {
console.log(err);
}
})
await User.find
抛出,则promises
数组将包含一个Promise,该Promise将被拒绝,这意味着await Promise.all(promises);
将抛出并被抓住 users.map
内部抛出异常,则_promises
将包含一个拒绝的Promise,因此请await Promise.all(_promises);
会抛出。 但这位于const promises = members.map
回调内部,因此这也将导致promises
包含被拒绝的await Promise.all(promises);
因此它将被await Promise.all(promises);
捕获await Promise.all(promises);
也一样 如果您调用的函数引发错误,该错误将退回到该函数调用所在的最近的catch块。
try {
throw "an error";
}
catch(e) {
console.log(e); //output: "an error"
}
现在考虑一下
try {
try {
throw "an error";
}
catch(e) {
console.log(e); //output: "an error"
}
}
catch(e) {
console.log(e); //This line is not going to be executed
}
这种机制可以将更多错误信息附加到每个级别中生成的错误中。 假设您的错误是一个对象,并且每个嵌套的catch bock都将自己的信息附加到错误对象,然后再次抛出该错误对象。
看下面的代码:
尝试{
try {
throw {internalError: 101};
}
catch(e) {
//Attach more info and throw again
e.additionalInfo = 'Disconnected when gathering information';
throw e;
}
}
catch(e) {
e.message = 'Cannot get information'
console.log(e); //Final error with lot of information
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.