我有一个简单的例子:
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)
})
如何为每个客户端连接打印正确的端口?
答案 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。