javascript - 使用 try/catch 和嵌套承诺等待
问题描述
也许是一个愚蠢的问题,但我应该在名为 "actionTwo()" 的方法中抓住承诺吗?什么是最佳实践?
async actionOne(req, res, next) {
try {
await this.actionTwo();
} catch( error ) => {
// catch the error
}
}
async actionTwo(req, res, next) {
return new Promise( function( resolve, reject ) {
// do something
resolve()
})
.catch( error ) {
// Do I need this catch statement???
reject( error )
}
}
解决方案
在任何可以处理错误的函数中捕获错误。这可能是一种功能,或两种功能,或两种功能都不是。
在您的示例中,如果actionTwo
遇到错误时需要执行某些操作(例如,actionTwo
失败的日志),那么您确实应该catch
在其中。但是,如果actionTwo
它本身在遇到错误时不需要做任何特别的事情,请不要.catch
进入它,而只需返回被拒绝的 Promise 以便其使用者(此处为actionOne
)可以处理错误。
如果actionOne
可以看到错误并因此做一些有用的事情(例如,actionOne
失败的日志,或呈现错误页面,或类似的东西),那么actionOne
应该捕获错误。否则,捕获错误没有多大用处,您应该只返回actionOne
Promise(由async
函数自动创建)供消费者asyncOne
处理。
最终,所有错误都应该在某个地方被捕获,否则你会得到未处理的拒绝。
请记住,如果被调用函数需要处理错误,并且它的使用者也需要查看和处理错误,则被调用函数将不得不在其 中重新抛出错误catch
,例如:
async actionOne(req, res, next) {
try {
await this.actionTwo();
} catch( error ) => {
// catch the error
}
}
async actionTwo(req, res, next) {
return new Promise( function( resolve, reject ) {
// do something
resolve()
})
.catch( error ) {
// handle error
throw error;
}
}
推荐阅读
- android - Adapter Class Android中的片段到片段事务
- javascript - 如何从文件中导入 JS 和 HTML?
- mysql - mysql8:使用introducer时服务器收到语句后应该翻译成什么字符集?
- flutter - ListView Builder 上的 Flutter 禁用按钮
- dsl - 我可以用 JetBrains MPS 中生成的 DSL 语言做什么?
- java - 如何显示两个日期之间的所有星期一?
- laravel - 在 Laravel 中哪里可以同时保存不同的模型?
- c - C fwrite() 结构到文件
- php - 如何从 LAST_INSERT_ID(`my_column`+1) 获取表达式的值?
- python - logits 和标签必须是可广播的:logits_size=[32,60] labels_size=[32,131]