2013-03-21 3 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) всегда удерживайте последние значения от объекта. По какой-то причине они перезаписываются. Странно я не могу использовать, например, s и prop внутри функции выбора mysql.

Мне нужен способ, чтобы иметь возможность использовать s и prop внутри MySQL выберите из цикла

Любые идеи?

ответ

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 
Смежные вопросы