使用异步函数作为if判断条件的执行顺序异常问题
问题原因
你当前的代码存在两个核心问题:
- 外层
con函数没有主动定义返回值,默认返回undefined,所以if判断的条件永远是假值 User.findOne是异步任务,你写在回调函数里的return只会把值返回给回调函数本身,无法传递到外层的con函数。等异步任务执行完成返回结果时,if判断逻辑早就执行完毕了。
解决方案
方案1:回调函数写法
第一步:修改con.js代码,把异步结果通过回调传递
const User = require ('../nodeDB/models/user.js'); const con = function (email, callback) { User.findOne( { userEmail: email }, function (err, doc) { if(err) { console.log(err); return callback(err); } // 你原代码返回逻辑和调用判断逻辑冲突,这里已修正:用户存在返回true,不存在返回false callback(null, !!doc); }); } module.exports.con = con;
第二步:调整调用逻辑,把判断写在回调里
const con = require('./con'); con.con('email@gmail.com', function(err, isUserExist) { if (isUserExist) { console.log('User exists!') } else { console.log('user does not exist?') } })
方案2:async/await写法(更推荐,可读性更高)
Mongoose的查询方法本身支持Promise,可以用async/await简化异步逻辑:
第一步:修改con.js为async函数
const User = require ('../nodeDB/models/user.js'); const con = async function (email) { try { const doc = await User.findOne( { userEmail: email } ); // 你原代码返回逻辑和调用判断逻辑冲突,这里已修正:用户存在返回true,不存在返回false return !!doc; } catch (err) { console.log(err); throw err; } } module.exports.con = con;
第二步:用await获取异步结果再做判断
const con = require('./con'); async function checkUser() { const isUserExist = await con.con('email@gmail.com'); if(isUserExist) { console.log('User exists!') } else { console.log('user does not exist?') } } checkUser();
如果你要保留原代码「用户存在返回false、不存在返回true」的逻辑,自行翻转上述返回值即可
内容的提问来源于stack exchange,提问作者Serhat
相关产品推荐
相关产品推荐

