Lets say i want to run an if statment where the condition is async function.
const con = require('./con');
if(con.con('email@gmail.com')
console.log('User exists!')
else {
console.log('user does not exist?')
}
This is the function, it uses mongoose findOne which is an async task.
const User = require ('../nodeDB/models/user.js');
const con = function (email) {
User.findOne( { userEmail: email }, function (err, doc) {
if(err) {
console.log(err);
}
if (doc) {
return false;
} else {
return true;
}
});
}
module.exports.con = con;
The problem is that the if statment gets called before the con can get executed which then does'nt set the condition.
Firstly your con()
function doesn't return anything. You will need to return User.findOne(....)
Your if statement needs to respect the fact that the async task has to complete first.
con.con('email@gmail.com')
.then((exists) => {
if (exists)
console.log('User exists!')
else {
console.log('user does not exist?')
}
})
Or with aynsc
/ await
:
async function checkIfUserExists() {
if (await con.con('email@gmail.com')
console.log('User exists!')
else {
console.log('user does not exist?')
}
}
Use await
or put your logic in then
block.
// must be in async declared function
if (await foo()) {
}
else {
}
or
foo().then(res=>{
if (res) {
}
else {
}
})
You can do it this way:
const con = userEmail => User.findOne({userEmail}).lean().exec();
(async () => {
if (await con('email@gmail.com')) {
console.log('User exists!')
} else {
console.log('user does not exist?')
}
})()
User.findOne
from your function. (optional) 2. Add it .lean()
(returns simple JSON, faster)
(optional) 3. Add it .exec()
so it returns a true Promise and not just a thenable
await con()
anywhere inside an async
function, just as if it was synchronous.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.