You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Promise的finally块无法获取then/catch返回值问题求助

Promise的finally块无法接收then/catch返回值的原因及解决方案

核心结论

Promise的finally回调函数不接收任何参数,这是ECMAScript规范明确规定的。不管前面的then或catch返回什么值,finally的参数都会是undefined,所以你代码里的connection在finally中拿不到是正常现象。

问题分析

你的代码里,虽然在then和catch中返回了connection,但finally的设计初衷是执行无关结果的清理操作(比如释放资源),它不依赖Promise链的最终返回值,因此不会接收任何参数。

解决方案

要在finally中拿到connection,可以通过以下两种方式实现:

方法1:将connection变量提升到外部作用域

把connection声明在Promise链外部,在获取到连接时赋值,后续finally直接使用这个变量:

let sql = "SELECT id, first, last FROM employee";
let values = [];
let connection; // 提升变量到外部

this.pool.getConnection()
    .then(conn => {
        connection = conn; // 赋值给外部变量
        return this.pool.query(connection, sql, values);
    })
    .then(({result}) => {
        resolve({code: 200, result: result});
    })
    .catch(({error}) => {
        reject({code: 400, result: error.sqlMessage});
    })
    .finally(() => {
        console.log(connection); // 现在可以拿到连接对象
        if (connection) this.pool.release(connection);
    });

方法2:用async/await重构代码(更直观)

使用async/await配合try...finally结构,能更清晰地管理连接资源:

async function queryEmployee() {
    let sql = "SELECT id, first, last FROM employee";
    let values = [];
    let connection;
    try {
        connection = await this.pool.getConnection();
        const {result} = await this.pool.query(connection, sql, values);
        resolve({code: 200, result: result});
    } catch ({error}) {
        reject({code: 400, result: error.sqlMessage});
    } finally {
        if (connection) this.pool.release(connection);
    }
}

补充说明

finally的唯一作用是保证无论Promise状态是resolved还是rejected,里面的代码都会执行。如果需要依赖Promise链的结果,应该在then或catch中处理,而不是finally。

内容的提问来源于stack exchange,提问作者Source

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:10:04