为何使用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
相关产品推荐
相关产品推荐

