admin管理员组文章数量:1516870
everyone.
I have a problem about the 'callback function - scope of variable',
I wanna use the 'i in for loop' to 'the callback function User_UidSearch',
but I cannot use it.
(I hope the solution don't use the global variable.)
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);
}
});
}
the "console.log(i);"
Recheck, this is wrong. -> Outputs are "undefined" of all.
undefined is "console.log(result[i]);"
But the "i" is keep '2' console twice, if results.length is 2.
I know becuz the for loop ending then execute the User_UidSearch,
but how can I slove the it "i" is 0 and 1.
everyone.
I have a problem about the 'callback function - scope of variable',
I wanna use the 'i in for loop' to 'the callback function User_UidSearch',
but I cannot use it.
(I hope the solution don't use the global variable.)
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);
}
});
}
the "console.log(i);"
Recheck, this is wrong. -> Outputs are "undefined" of all.
undefined is "console.log(result[i]);"
But the "i" is keep '2' console twice, if results.length is 2.
I know becuz the for loop ending then execute the User_UidSearch,
but how can I slove the it "i" is 0 and 1.
Share Improve this question edited Aug 13, 2014 at 8:02 Salmon asked Aug 13, 2014 at 7:48 SalmonSalmon 1333 silver badges11 bronze badges 6-
No, it's not. It's defined in outer
functionlocal scope. But it's used in closure, which needs special logic to work. @Salmon - are you sureconsole.log(i)writesundefinedand not the value ofresults.length? – Ilya Luzyanin Commented Aug 13, 2014 at 7:55 - @BOSS I would love to see a fiddle demonstrating that. – Robby Cornelissen Commented Aug 13, 2014 at 7:56
-
1
"Outputs are 'undefined' of all" doesn't really fit with the snippet provided.
ishould at least be a number, just maybe not the particular values expected. If each log shows the value ofresults.length, then see: JavaScript closure inside loops – simple practical example. – Jonathan Lonowski Commented Aug 13, 2014 at 7:56 - wrap the user_UidSearch call in a closure, pass in i and results – MartinWebb Commented Aug 13, 2014 at 7:57
- @IlyaLuzyanin: rigt.my bad i didnt see it through clearly.removed my ment – Prabhu Murthy Commented Aug 13, 2014 at 7:58
2 Answers
Reset to default 3Your problem may be solved, but let me still add these points so others know the correct approach.
Firstly, its not a good practice to call an asynchronous function inside a loop. This would lead to unexpected results.
Using closures is fine for some cases, but not this one. Read here for Practical uses of closures.
There are several problems in the approach you've taken,
- If the results array is too long, there'll be a too many open requests.
callback(results)will be called before even a single callback ofUser_UidSearchis called.
In your case, you should be using recursive function like this:
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);
}
});
}
Read this if interested detailed explaination of different control flows.
You're dealing with closures, rewrite your code as follows:
...
(function(id) {
User_UidSearch(results[id].employee, function (user) {
console.log(id);
// results[i]['email'] = user.email;
});
})(i);
I.e. wrap your function to unbind i.
本文标签: nodejsJavascriptoutside variable scope in callback functionStack Overflow
版权声明:本文标题:node.js - Javascript, outside variable scope in callback function? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/web/1744771437a2624362.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论