javascript nodejs if 语句以意外顺序调用
javascript nodejs if statements being invoked in unexpected order
根据下面的代码,我假设我 运行 遇到了异步问题。
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 语句末尾调用相同的函数。
我是否还需要确保在 else 语句中调用 next(),以确保在消息检查中的 return 处理完成之前不会调用它? :
console.log('message check ', message)
if (message.length) {
return res.status(409).send({
'message': message
});
}
else{
console.log('next')
next();
}
};
这看起来您对 User.find
的调用是异步的;因此,您传递的回调函数中的代码在包含 existingCheck
函数 returns.
之后执行
如果您希望某些事情仅在 User.find
调用完成后发生,您也必须将该代码放入回调中。
请注意,您不能 return 来自回调内部封闭函数的值。毕竟,回调执行时,封闭函数已经完成。如果你想 return 一个异步值, return 一个 Promise
给它(或将值传递给回调)。
根据下面的代码,我假设我 运行 遇到了异步问题。
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 语句末尾调用相同的函数。
我是否还需要确保在 else 语句中调用 next(),以确保在消息检查中的 return 处理完成之前不会调用它? :
console.log('message check ', message)
if (message.length) {
return res.status(409).send({
'message': message
});
}
else{
console.log('next')
next();
}
};
这看起来您对 User.find
的调用是异步的;因此,您传递的回调函数中的代码在包含 existingCheck
函数 returns.
如果您希望某些事情仅在 User.find
调用完成后发生,您也必须将该代码放入回调中。
请注意,您不能 return 来自回调内部封闭函数的值。毕竟,回调执行时,封闭函数已经完成。如果你想 return 一个异步值, return 一个 Promise
给它(或将值传递给回调)。