从嵌套函数返回
Coming back from nested functions
我是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)
语句,这意味着无论Unit.findById
是异步的,您的代码都将始终执行return(output)
。也就是说,代码不会等待来自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);
}
});
Owner.findOne
是另一个异步函数,因此您需要将reply(output)
移动到您output.success = false;
的 else 块中,并在 Owner.findOne
的回调中添加另一个reply(output)
调用。
在代码中,return reply(output)
在执行 Owner.findOne
的异步回调之前调用。此外,你不需要return
,因为你不能使用return
从那些回调中返回一个值,return
只在那里退出函数。
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
}
reply(output);
});
} else {
output.success = false;
reply(output);
}
});
}
};
- 使用返回函数sinde.attr()jquery元素
- 从自执行函数返回函数的Javascript性能命中率
- Node Express Handlebars帮助程序未返回函数的结果
- 未在Firefox中执行PageMethod的返回函数
- 对返回函数的函数感到困惑
- 从承诺返回不返回函数会导致警告
- 从函数返回函数而不调用返回的函数
- Javascript,闭包中的返回函数如何与外部函数连接
- 为什么Coderbyte.com's的Javascript模板喜欢返回函数的原始参数
- 对象函数返回函数而不是值
- 从外部函数(数组)了解返回函数(x)
- 从Javascript类对象返回函数
- 调用Typescript setter don't返回函数,尽管关联的getter可以工作
- 使用依赖注入在 JavaScript 中返回函数
- 通过单击JSP和javascript加载两个返回函数
- 需要说明:无法理解返回函数的javascript
- 简单的onClick返回函数不起作用
- 为什么这个闭包返回函数
- JS函数返回函数供以后使用-未定义参数
- Coffeescription类中的方法返回函数而不是字符串