我评论了第一次(也是唯一一次)执行for循环的值。我做什么似乎并不重要...在connection.query后,我的for循环总是被赋予一个逃避循环的值。不知道为什么。我可以提供更多的例子。任何人都知道可能会发生什么以及我如何解决这个问题? 这是一段有这个问题的代码片段。 我正在使用的node.js的mysql插件就在这里
https://github.com/felixge/node-mysql
for (j=0;j<rows[i].movelimit;j++){
//j=0
sql2="SELECT x, y, land FROM map WHERE collision = 0 AND x>"+(lastX-55)+" AND x<"+(lastX+55)+" AND y>"+(lastY-55)+" AND y<"+(lastY+55)+" AND land='"+rows[i].land+"'"+restrictions;
connection.query(sql2, function(err, move, fields) {
//j=rows[i]movelimit
答案 0 :(得分:3)
它似乎是一个异步回调。因此,超出回调函数范围的循环变量j
将始终求值为循环结束前分配的最后一个值。另请参阅javascript for loop unexpected behaviour或JavaScript closure inside loops – simple practical example。
使用closure:
function getCallbackFn(index) {
return function(err, move, fields) {
....
// "index" will always point to the function argument
};
}
for (j=0;j<rows[i].movelimit;j++) {
var sql2 = ...
connection.query(sql2, getCallbackFn(j));
}
更短,内联IEFE:
for (j=0;j<rows[i].movelimit;j++) (function(j){
var sql2 = ...
connection.query(sql2, function(err, move, fields) {
....
// "j" points to the function argument
});
})(j);