javascript nodejs if语句是以意外的顺序调用的

鉴于下面的代码,我假设我遇到了asynchronous问题。

exports.existingCheck = function (req, res, next) { var query = [], message = [], userObj = {}, i, body = req.body; if(body.displayName){ var regex = new RegExp(["^", body.displayName, "$"].join(""), "i"); }; if(req.user){ var userObj = req.user; } if (body.displayName !== userObj.displayName) { console.log('body n no match') query.push({ displayName: regex }); } if (body.email !== userObj.email) { console.log('body e no match') query.push({ email: body.email }); } console.log('query pre ', query) if (query.length) { console.log('query init ', query) //find a match for email or display name and send appropriate error message; User.find({ $or: query }, function (err, existing) { if (err) { console.log('register er ', err) } if (existing.length) { for (i = 0; i < existing.length; i++) { var conditional1 = false, conditional2 = false; console.log('conditional1 init ', conditional1) if(body.displayName && (userObj._id !== existing[i]._id)){ conditional1 = body.displayName.toLowerCase() === existing[i].displayName.toLowerCase(); }; console.log('conditional1 after ', conditional1) if(body.email && (userObj._id !== existing[i]._id)){ conditional2 = body.email.toLowerCase() === existing[i].email.toLowerCase(); } if (conditional2) { message.push('Email is not unique.'); } if (conditional1) { message.push('Display name has already been taken.'); } } } }); } console.log('message check ', message) if (message.length) { return res.status(409).send({ 'message': message }); } console.log('next') next(); }; 

下面的代码将导致console.logS按以下顺序触发:

 body n no match query pre [ { displayName: /^bobohead$/i } ] query init [ { displayName: /^bobohead$/i } ] message check [] next conditional1 init false conditional1 after true 

问题在于,在调用消息检查和next()之后,条件没有接收到它们的值。

我认为if语句阻塞了代码,并且会等待另一个被解雇。

我假设我将需要添加一个else语句来调用一个函数调用消息检查和next()&调用初始if语句结束时的相同的function。

我是否还需要确保在else语句中调用next(),以确保在消息检查返回之前不会调用它? :

 console.log('message check ', message) if (message.length) { return res.status(409).send({ 'message': message }); } else{ console.log('next') next(); } }; 

这看起来像你对User.find的调用是asynchronous的; 因此,您传递的callback函数中的代码在包含existingCheck函数返回后执行。

如果只有在User.find调用完成后才想要发生某些事情,则必须将该代码放在callbackUser.find

请注意,您不能从callback中的封闭函数返回值。 毕竟,在callback执行的时候,封闭function已经完成了。 如果你想返回一个asynchronous值,则返回一个Promise给它(或者将值传递给一个callback函数)。