javascript - 如何使用单个 catch 函数进行嵌套异步等待?
问题描述
我有这个代码:
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
您可以在处理程序的顶层只有一个。如果 Promise 在它内部产生的所有链接都链接到一个await
在顶层编辑的 Promise(如您的示例中),则该顶部await
将捕获内部任何地方抛出的错误。
但是,除非也处理 Promise 拒绝,否则您的catch
部分不应出现 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,这意味着顶部await Promise.all(promises);
将抛出并被捕获 - 如果里面有东西
users.map
抛出,_promises
将包含一个拒绝的 Promise,所以await Promise.all(_promises);
也会抛出。但这在const promises = members.map
回调内部,所以这也会导致promises
包含一个被拒绝的 Promise - 所以它也会被 the 捕获await Promise.all(promises);
。
推荐阅读
- django - 通过 Cloud Foundry 编辑 nginx.conf 文件
- maintenance - Mattermost - 如何将频道转移到另一个团队
- image - 在 WSO2 EI 6.1.1 中将文件夹从一个位置移动到另一个位置
- reactjs - Nextjs 在组件中混合 SSR 和客户端数据
- assembly - Mips 地址超出范围运行时异常
- c++ - 对带有 push_back 调用的向量进行迭代
- javascript - 如何从 axios.create({baseURL}) 获取 BaseURL?
- swift - 子视图不与父 UIView 一起移动
- javascript - 为什么反应不条件渲染
- python - Python Dataframe:根据月份获取替代日期?