我是Node / javascript的新手,所以我的问题可能很简单,但是这同样给我带来麻烦。
我有以下代码。它成功检查了数据库中的Unit
和Owner
值。问题是if语句else if (Owner){
之后的代码按预期执行,但是,在程序永远不会到达return reply(output);
行之后,我希望它会执行。
我认为这是我从Owner.findOne(...
代码回来的方式。
谁能看到我在做什么错?
exports.sale = {
tags: ['api'],
validate : {
//blah blah blah
},
handler : function(request, reply) {
var output = {
success: true,
operations: [],
epoch: Date.now()
};
Unit.findById(request.payload.deviceNumber, function(err, device) {
if (err) {
//blah blah blah
}
if (device) {
Owner.findOne({OwnerId: device.Owner}, function(err, Owner) {
if (err) {
//blah blah blah
}
else if (Owner){
//make changes to output.operations
}
});
} else {
output.success = false;
}
return reply(output);
});
}
};
最佳答案
代码中有几个问题。
首先,假设if (err)
子句没有相同的return reply(output)
语句,这意味着您的代码将始终执行return(output)
,因为Unit.findById
是异步的。也就是说,代码不会等待Unit.findById
的响应完成,并且一旦调用它,代码将继续运行并最终命中return
语句。
其次,在回调函数的代码块中,Owner.findOne
应该具有自己的return
语句,因为代码只会在其中传播。
因此,对于Owner.findOne和Unit.findById成功执行的快乐路径,您仍然会收到output.success = false
的响应。
因此,忽略代码的可读性即可解决问题-您的代码应如下所示。
Unit.findById(request.payload.deviceNumber, function(err, device) {
if (err) {
//blah blah blah
output.success = false;
return reply(output);
}
if (device) {
Owner.findOne({OwnerId: device.Owner}, function(err, Owner) {
if (err) {
//blah blah blah
output.success = false;
return reply(output);
}
else if (Owner){
//make changes to output.operations
}
output.success = true;
return reply(output);
});
} else {
output.success = false;
return reply(output);
}
});
关于javascript - 从嵌套函数回来,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38421430/