0

我正在循环中运行 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)始终保存对象的最后一个值。s出于某种原因,它们被覆盖了。奇怪的是,例如,我不允许prop在 mysql select 函数中使用它们。

我需要一种能够在 mysql select from loop中使用sand的方法prop

有任何想法吗?

4

1 回答 1

0

这是预期的行为。for..in 循环的每次传递都定义了一个闭包,并且所有闭包都在其作用域链中引用相同的函数作用域。虽然ccddchannel都是此范围内的变量,但您当然会得到相同的输出。

如果您想要不同的输出,则必须在更改它们的值之前将这些变量绑定到函数。尝试:

            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
于 2013-03-21T08:27:07.520 回答