【发布时间】:2014-10-01 15:02:17
【问题描述】:
我正在尝试编写一个验证函数来验证我的请求标头。如果所有标题都正常,则返回 true,如果有问题,则返回 false。我为每个(几乎)请求执行此功能。问题是,由于变量范围的一些问题,我不知道如何返回主函数,以防我使用回调并且设置任何标志都不起作用。当我在没有回调的情况下工作时一切都很好,我只是使用下划线来查询我的 JSON。现在我使用 NeDB 并绑定到回调,我无法完成工作。 我尝试使用全局“res”变量,但问题是,当我将参数“cnt”的值(如果找不到令牌,则为 0,如果有令牌,则为 1)分配给“res”,然后“res”的值" 总是落后于 "cnt" 1 次迭代:即:
request1 (valid): cnt = 1; res = undefined;
request2 (valid): cnt = 1; res = 1;
request3 (invalid): cnt = 0; res = 1;
request4 (valid): cnt = 1; res = 0;
我要做的就是在“cnt” = 1 时返回主函数,如果“cnt” = 0 时返回 false,或者借助全局变量或使用其他方法。
function validateHeaders(request) {
if (request.headers.username && request.headers.deviceid) {
if (...) {
function getResult(callback) {
db.tokens.count({...
}, function (err, cnt) {
if (err) {
console.log(err);
} else {
callback(cnt);
}
});
}
getResult(function (cnt) {
res = cnt;
console.log({
count: cnt
});
});
console.log({
result: res
});
} else {
return false;
}
} else {
return false;
}
}
【问题讨论】:
-
由于函数内部有一个异步函数,并且在完成之前您不应该返回,因此您需要通过添加回调使您的主函数
validateHeaders也异步。 -
“异步”表示该函数进入事件队列以运行——最早——当当前同步函数完成时。因此,JavaScript 引擎严格保证
validateHeaders将在任何异步操作开始之前完全运行并返回一个值(例如对db.tokens.count的回调)。 -
这基本上是How to return the response from an Ajax call? 的副本——只需将“Ajax 成功函数”替换为
db.tokens.count。其他类似的问题还有Understanding Node.js processing order和how to make synchronous call to indexeddb method from javascript -
非常感谢您的意见!