我有以下代码:
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
也处理Promise拒绝,否则您的throw
部分不应.on
另一个错误,否则,您将得到未处理的Promise拒绝:
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
也包含被拒绝的Promise-因此它也将被await Promise.all(promises);
捕获。 关于javascript - 如何对嵌套异步等待使用单一捕获功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56233161/