0

簡単な例があります:

   for ( i in dbs ) {
       var db = dbs[i].split(':')
       var port = dbs[i][0]
       var host = dbs[i][0]
       var client = redis.createClient( port, host )
       tasks = [ [ "info" ] ]
       client.multi(tasks).exec(function (err, replies ) {
           console.log(port)
       })

各クライアント接続の正しいポートを出力する方法は?

4

1 に答える 1

5

簡単な方法は、ループ本体を自己呼び出しの無名関数で囲むことです。

for (var i in dbs) {
    (function(i) {
        var db = dbs[i].split(":");
        var host = db[0];  // Probably 'db[0]' instead of 'dbs[i][0]'.
        var port = db[1];  // Probably 'db[1]' instead of 'dbs[i][0]'.
        var client = redis.createClient(port, host);
        tasks = [ [ "info" ] ];
        client.multi(tasks).exec(function(err, replies) {
            console.log(port);
        });
    })(i);
}

こうすることで、 の現在の値がportクロージャによって適切にキャプチャされ、 に渡されるコールバックで使用できるようになりますexec()

この回答は、ループ変数としてdbs使用していても、それが配列ではなくオブジェクトであると想定していることに注意してください。iが配列の場合dbsは、代わりにインデックス付きループを使用する必要があります。

for (var i = 0; i < dbs.length; ++i) {
    // ...
}

for... inループは配列を反復処理するためのものではないためです。

于 2013-03-01T10:56:08.473 に答える