javascript - 在使用 await 时使用 catch 处理 Promise 拒绝
问题描述
我await
用来使代码更干净,但我不确定我是否正确处理了异常。
使用 azure-devops-node-api 的示例;
const foo = async() => {
return new Promise((resolve, reject) => {
...
...
const teams = await coreApiObject.getTeams(currProject.id)
.catch(err => { reject(err) return })
...
...
})
}
在这段代码中,我假设,如果 Promise 调用有问题, foo() 将返回拒绝。
解决方案
async
函数总是返回一个promise,所以你不需要自己显式地创建一个。从异步函数返回的任何非承诺值都隐含在承诺中。
在foo
函数内部,您只需要await
调用coreApiObject.getTeams(...)
并捕获和处理任何错误,使用try-catch
块。
您的代码可以简化如下所示:
const foo = async() => {
try {
const teams = await coreApiObject.getTeams(currProject.id);
return teams;
} catch (e) {
// handle error
}
}
如果您想调用代码来处理错误,那么您可以使用以下选项之一:
删除
try-catch
块并仅返回coreApiObject.getTeams(...)
.const foo = async() => { return coreApiObject.getTeams(currProject.id); }
删除
try-catch
块并仅返回调用coreApiObject.getTeams(...)
将允许调用代码处理错误,因为foo
函数返回的承诺将解析为返回的承诺coreApiObject.getTeams(...)
:这意味着foo
函数返回的承诺的命运将取决于任何发生在coreApiObject.getTeams(...)
.如果返回的 promise
coreApiObject.getTeams(...)
被拒绝,foo
函数返回的 promise 也将被拒绝,因此调用代码将进行更改以捕获 promise 拒绝并处理它。从
catch
块中抛出错误。const foo = async() => { try { const teams = await coreApiObject.getTeams(currProject.id); return teams; } catch (error) { // throw the error throw error; } }
您需要从
catch
块中抛出错误以确保async
函数返回的承诺被拒绝;如果您从块中返回一个值,则函数catch
返回的承诺将解析为块返回的任何值。async
catch
推荐阅读
- reactjs - 使用 react-select 处理焦点
- javascript - 延迟加载和 ajax 调用问题
- list - 如何获取未知长度的 CMake 列表的最后一个元素?
- rust - 在 Substrate 框架中,如何从 Keypair 中获取私钥(secret key)?
- google-cloud-platform - GKE 上的 Kubernetes 入口在 https 上的 http / SSL_ERROR_SYSCALL 上导致 502 响应
- xamarin - 此 apk 导致未使用的代码和资源
- database - 将网站迁移到中文服务器后无法访问 wp-admin
- html - 如何允许鼠标单击靠近元素?
- mysql - Cloud Run:连接到 Cloud SQL 实例
- excel - 使用宏将单元格信息粘贴到电子邮件正文