2012-04-03 45 views
0

我正在尝试给我们Async.js来处理项目数组。有没有一些可爱的方式来让这个工作正常?如果你比我聪明,除了由于延迟执行,http://3被打印三次。Async.js - 推迟执行,同时仍然访问正确的数组索引

jsFiddle link

var a_servers = ['http://1', 'http://2', 'http://3']; 

var a_actions = []; 

for (var i = 0; i < a_servers.length; i += 1) 
{ 
    var server = a_servers[i]; 

    a_actions.push(function(callback) 
    { 
     document.write(server + '<br/>'); 
     callback(false, server); 
    }); 
} 

async.series(a_actions, function(err, a_servers) 
{ 
    document.write('processed ' + a_servers.length + ' servers<br>'); 
    console.info(a_servers); 
});​ 

回答

1

你有一个经典的封闭范围的问题。您需要将server变量从外部范围传递到内部范围以获取所需的行为。你可以为此使用一个IIFE。

for (var i = 0; i < a_servers.length; i += 1) 
{ 
    var server = a_servers[i]; 

    a_actions.push((function(server) { 
     return function(callback) { 
      document.write(server + '<br/>'); 
      callback(false, server); 

    })(server)); 
} 
+0

Gah,谢谢,只是想通了,回来问是否有更简单的方法。 http://jsfiddle.net/gYZhw/2/ – Langdon 2012-04-03 04:13:26

+1

我的一般模式是定义一个定义和返回闭包的顶层函数,闭包以(关闭)作为闭包范围的一部分顶级功能。然后,它明确地将闭包范围的复杂性与循环尝试完成/构建的内容区分开来。所以你最终得到'a_actions.push(makeWriter(server));',我认为这更清晰。 – 2012-04-03 04:17:15