NodeJ循环遍历对象变量表现得很奇怪

时间:2013-03-21 07:43:16

标签: node.js

我在循环中运行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函数中使用例如sprop

我需要一种能够在循环中使用mysql select sprop的方法

有什么想法吗?

1 个答案:

答案 0 :(得分: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