Javascript, outside variable scope in callback function?
大家。
我有一个关于'回调函数 - 变量范围'的问题,
我想用'i in for loop'来'回调函数User_UidSearch',
但我不能用它。
(我希望解决方案不使用全局变量。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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); } }); } |
"console.log(i);"
重新检查,这是错误的。 - >输出是"未定义"的。
undefined是"console.log(result [i]);"
但是如果results.length是2,那么"i"将保持'2'控制台两次。
我知道becuz for循环结束然后执行User_UidSearch,
但我怎么能解决它"我"是0和1。
您的问题可能会得到解决,但让我仍然添加这些要点,以便其他人知道正确的方法。
首先,在循环中调用异步函数不是一个好习惯。 这将导致意想不到的结果。
在某些情况下使用闭包很好,但不是这个。 请阅读此处了解封盖的实际用途。
你采取的方法有几个问题,
在您的情况下,您应该使用这样的递归函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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); } }); } |
如果有兴趣详细解释不同的控制流程,请阅读此内容。
您正在处理闭包,重写您的代码如下:
1 2 3 4 5 6 7 | ... (function(id) { User_UidSearch(results[id].employee, function (user) { console.log(id); // results[i]['email'] = user.email; }); })(i); |
即 将函数包装为取消绑定