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
相关产品推荐
相关产品推荐

