我在循环中运行mysql选择,由于某种原因我的变量被覆盖..
我的代码如下:
setInterval(function () {
for (var s in _bots) {
if (_bots.hasOwnProperty(s)) {
var obj = _bots[s];
for (var prop in obj) {
console.log(' ----- ' + _bots[s][prop].channel + ' ----- ');
channel = _bots[s][prop].channel;
cc = s;
dd = prop;
var sql = 'SELECT * FROM `usrs` WHERE cID = ' + connection.escape(_bots[s][prop].channel) + ' LIMIT 1';
connection.query(sql, function(err, results) {
if(results.length != 0) {
console.log('NAME ---> ' + cc);
console.log('MSG_TO ---> ' + dd);
console.log('ID ---> ' + channel);
} else {
//....
}
});
}
}
}
}, 15000)
问题是NAME --> MSG_TO --> variables (cc, dd and channel)
始终保留对象的最后一个值。由于某种原因,它们被覆盖了。奇怪的是我不允许在mysql select函数中使用例如s
和prop
。
我需要一种能够在循环中使用mysql select s
和prop
的方法
有什么想法吗?
答案 0 :(得分:0)
这是预期的行为。 for..in循环的每次传递都定义了一个闭包,所有闭包都在其作用域链中引用相同的函数作用域。虽然cc
,dd
和channel
都是此范围内的变量,但您获得的输出相同。
如果需要不同的输出,则必须在更改其值之前将这些变量绑定到函数。尝试:
connection.query(sql, function(cc, dd, channel, err, results) {
if(results.length != 0) {
console.log('NAME ---> ' + cc);
console.log('MSG_TO ---> ' + dd);
console.log('ID ---> ' + channel);
} else {
//....
}
}.bind(null, cc, dd, channel)); // bind the values here