首页 > 解决方案 > 使用 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 )
    }
}

标签: javascriptnode.js

解决方案


在任何可以处理错误的函数中捕获错误。这可能是一种功能,或两种功能,或两种功能都不是。

在您的示例中,如果actionTwo遇到错误时需要执行某些操作(例如,actionTwo失败的日志),那么您确实应该catch在其中。但是,如果actionTwo它本身在遇到错误时不需要做任何特别的事情,请不要.catch进入它,而只需返回被拒绝的 Promise 以便其使用者(此处为actionOne)可以处理错误。

如果actionOne可以看到错误并因此做一些有用的事情(例如,actionOne失败的日志,或呈现错误页面,或类似的东西),那么actionOne应该捕获错误。否则,捕获错误没有多大用处,您应该只返回actionOnePromise(由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;
    }
}

推荐阅读