2013-03-21 98 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