Javascript,在回调函数中的变量范围之外
Javascript, outside variable scope in callback function?
everyone.
我对"回调函数 - 变量范围"有问题,
我想使用"i in for 循环"到"回调函数User_UidSearch",
但我不能使用它。
(我希望解决方案不要使用全局变量。
Task_TidSearchExecution = function(tid, callback) {
var sql = "SELECT * FROM execution WHERE task = '" + tid + "'";
dbclient.query(sql, function (err, results) {
if (err || results.length <= 0)
callback(false);
else {
console.log(results.length);
for (var i = 0 ; i < results.length ; i++) {
User_UidSearch(results[i].employee, function (user) {
console.log(i);
// results[i]['email'] = user.email;
});
}
callback(results);
}
});
}
"控制台.log(i(;">
重新检查,这是错误的。 -> 输出是"未定义的"。
undefined 是 "console.log(result[i](;">
但是"i"保持"2"控制台两次,如果结果长度为2。
我知道,因为 for 循环结束然后执行User_UidSearch,
但是我怎么能喜欢它"i"是 0 和 1。
你的问题可能已经解决了,但让我仍然补充这些要点,以便其他人知道正确的方法。
首先,在循环中调用异步函数不是一个好的做法。这将导致意想不到的结果。
在某些情况下使用闭包是可以的,但不是这种情况。阅读此处了解闭包的实际用途。
您采取的方法存在几个问题,
- 如果结果数组太长,则会有太多打开的请求。
- 在调用
User_UidSearch
的单个回调之前,将调用callback(results)
。
在您的情况下,您应该像这样使用递归函数:
var len = results.length;
var count = 0;
function my_func() {
User_UidSearch(results[count].employee, function (user) {
console.log(count);
// results[count]['email'] = user.email;
count += 1;
if (count < len) {
my_func();
} else {
callback(results);
}
});
}
如果有兴趣详细解释不同的控制流,请阅读此内容。
您正在处理闭包,请按如下方式重写代码:
...
(function(id) {
User_UidSearch(results[id].employee, function (user) {
console.log(id);
// results[i]['email'] = user.email;
});
})(i);
即包装您的函数以解绑i
。
相关文章:
- js命名空间和变量范围
- 如何确保变量范围在这个循环中得到维护
- 在两个浏览器选项卡之间共享变量范围
- 文件API中的Javascript变量范围
- javascript和jQuery的嵌套对象函数中的变量范围
- JavaScript 函数变量范围问题
- JavaScript 中变量范围的问题
- Javascript - 揭示对象和变量范围
- 主干.js(具有 Require.js)变量/范围访问问题
- Javascript 变量范围未定义
- 如何绕过javascript变量范围
- IE 8变量范围错误
- 了解 Javascript 变量范围
- 控制变量范围
- 函数之间的Javascript变量范围问题
- 这种减少if语句中声明的变量范围的模式是一种好的做法吗
- 用于未初始化的局部变量的javascript变量范围
- 变量范围
- 请求节点模块变量范围
- Javascript 和 JQuery dom 全局变量范围