如何将变量传递给回调函数?

时间:2013-03-01 10:49:16

标签: javascript node.js callback

我有一个简单的例子:

   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)
       })

如何为每个客户端连接打印正确的端口?

1 个答案:

答案 0 :(得分: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循环are not meant to iterate over arrays