0

ループ内から mysql selects を実行していますが、何らかの理由で変数が上書きされています..

以下の私のコード:

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何らかの理由でそれらは上書きされます..奇妙なことに、たとえばpropmysql select関数内で使用することは許可されていません。

mysql select from the loop 内でsandを使用できるようにする方法が必要ですprop

何か案は?

4

1 に答える 1

0

これは予期される動作です。for..in ループの各パスがクロージャを定義し、すべてのクロージャがスコープ チェーンで同じ関数スコープを参照します。ccdd、およびはすべてこの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
于 2013-03-21T08:27:07.520 に答える