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

异步函数中回调返回值导致Promise返回undefined问题求助

问题分析与解决方案

嘿,我来帮你梳理下为啥会拿到undefined,以及怎么修复这个问题~

问题根源

你写的query函数虽然加了async关键字,但本质上没正确处理异步逻辑:

  • this.connection.query是回调风格的异步API,它不会返回查询结果,而是通过第三个回调函数传递结果/错误。你直接返回的rows其实是这个同步调用的返回值(通常是一个请求对象或者undefined),完全不是回调里的查询结果。
  • 回调函数里的return rows也没用,因为这个回调是被数据库驱动调用的,它不会把这个返回值传递给外层的async函数。
  • 你的async函数最终返回了一个resolved状态的Promise,但值是undefined,所以then里拿到的就是undefined。

修复方案:把回调API包装成Promise

async/await是Promise的语法糖,必须基于Promise才能正确处理异步结果。我们需要把回调风格的connection.query包装成Promise,这样async函数才能正确返回异步结果。

修正后的代码如下:

// 改造后的query函数
async query(sql, args) {
  // 用Promise包裹回调式API
  return new Promise((resolve, reject) => {
    this.connection.query(sql, args, (err, rows) => {
      if (err) {
        // 出错时reject错误
        reject(new Error(err));
      } else {
        // 成功时resolve结果
        resolve(rows);
      }
    });
  });
}

// 调用方式不变,现在能拿到正确结果了
db.query("select 1")
  .then((row) => console.log("Rows", row))
  .catch((e) => console.log(e));

如果你更喜欢用await的写法,也可以这么写:

async function fetchData() {
  try {
    const row = await db.query("select 1");
    console.log("Rows", row);
  } catch (e) {
    console.log(e);
  }
}

fetchData();

为什么这样能解决问题?

  • 我们手动创建了一个Promise,把数据库查询的异步逻辑包裹起来:当查询成功时调用resolve(rows)传递结果,失败时调用reject(err)传递错误。
  • async函数会自动处理返回的Promise,外部调用时就能通过then或者await拿到正确的查询结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:28:03