2013-03-21 57 views
0

我运行MySQL从一个循环内进行选择,由于某种原因,我的变量都被覆盖..通过的NodeJS对象变量循环举止奇怪

我下面的代码:

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)总是保持对象的最后值。由于某种原因,他们overwriten ..奇怪的是我不允许在mysql选择功能内使用例如sprop

我需要一种方法能够使用从环

任何想法了MySQL里面的sprop选择?

回答

0

这是预期的行为。 for..in循环的每个过程定义一个闭包,并且所有闭包都在其作用域链中引用相同的函数作用域。虽然cc,ddchannel都是这个范围内的变量,当然你会得到相同的输出。

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

  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