简体   繁体   中英

Using async functions as conditions

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?')
    }
})()
  1. 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

  1. now you can simply 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM