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

为何使用await后validateUser函数仍返回Promise {pending}?

为什么async函数返回的还是Promise {pending}?

嘿,我来帮你捋清楚这个问题~ 你遇到的情况其实是async函数的核心特性,先敲个重点:所有async函数的返回值本质上都是Promise,哪怕你在函数内部用了await拿到了具体值,最后return出去的时候,JS都会自动把这个值包装成一个resolved状态的Promise。

你看你的validateUser函数,虽然内部用await promise等待了数据库查询的结果,并且return了bool,但因为这是个async函数,所以它的返回值必然是一个Promise,而不是直接的"true"或"false"。当你直接调用validateUser(username, password)的时候,拿到的就是还处于pending状态的Promise,直到内部的异步操作完成,这个Promise才会变成resolved或rejected状态。

怎么拿到真正的布尔值?

有两种常用方式获取最终结果:

1. 在async函数里用await调用它

因为await只能在async函数内部使用,所以你需要把调用逻辑放在另一个async函数里:

async function checkUser() {
  try {
    let isValid = await validateUser('testUser', 'testPass');
    console.log(isValid); // 这里拿到的就是"true"或"false"
  } catch (err) {
    console.log(err); // 这里会捕获到你reject的"false"
  }
}
checkUser();

2. 用.then()和.catch()链式调用

如果不想用async函数包裹,也可以直接用Promise的链式调用:

validateUser('testUser', 'testPass')
  .then(bool => {
    console.log(bool); // 成功时拿到"true"
  })
  .catch(err => {
    console.log(err); // 失败时拿到"false"
  })

额外提个小建议:优化你的Promise逻辑

你现在的代码里把用户不存在的情况用reject("false")处理其实不太合理——用户不存在是正常的业务逻辑,不是错误。建议把它改成resolve(false),只把数据库查询的错误用reject抛出,这样代码逻辑更清晰:

async function validateUser(username, password) {
  var sql = "SELECT * FROM users WHERE username = ? AND password = ?";
  var values = [username, password];
  let promise = new Promise((resolve, reject) => {
    con.query(sql, values, function(err, results) {
      if (err) {
        reject(err); // 只把数据库错误作为reject
        return;
      }
      // 直接返回布尔值,用resolve包装
      resolve(results.length > 0);
    })
  });
  let bool = await promise;
  return bool;
}

这样修改后,调用的时候就不用在catch里处理用户不存在的情况了:

async function checkUser() {
  try {
    let isValid = await validateUser('testUser', 'testPass');
    if (isValid) {
      console.log('用户验证通过');
    } else {
      console.log('用户名或密码错误');
    }
  } catch (err) {
    console.error('数据库查询出错:', err); // 只处理真正的错误
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:57:30