Lets say i want to run an if statment where the condition is async function.
const con = require('./con');
if(con.con('[email protected]')
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.
CodePudding user response:
You can do it this way :
const con = userEmail => User.findOne({userEmail}).lean().exec();
(async () => {
if (await con('[email protected]')) {
console.log('User exists!')
} else {
console.log('user does not exist?')
}
})()
- Return
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
- now you can simply
await con()
anywhere inside anasync
function, just as if it was synchronous.
CodePudding user response:
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 protected]')
.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 protected]')
console.log('User exists!')
else {
console.log('user does not exist?')
}
}
CodePudding user response:
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 {
}
})