2011-05-20 76 views
30

我有一个for循环封闭ajax调用,我试图确定从for循环传递索引到回调函数的最佳方法。这是我的代码:从for循环传递索引到ajax回调函数(JavaScript)

var arr = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]; 

for (var i = 0; i < arr.length; i++) 
{ 
    $.ajaxSetup({ cache:false }) 
    $.getJSON("NatGeo.jsp", { ZipCode: arr[i], Radius: 
      document.getElementById("radius").value, sensor: false },  
      function(data) 
      { 
       DrawZip(data, arr[i]); 
     } 
); 
} 

当前,由于异步ajax调用,只传递arr数组的最后一个值。除了同步运行ajax调用之外,如何将arr数组的每次迭代传递给回调函数?

+2

虽然这是大约一个重复[30其他问题](http://stackoverflow.com/questions/tagged/javascript+closures+loops),在循环中使用函数时,这是一个非常常见的问题,我希望你不会介意修改其中的一个标签推数量达到31 :) – Anurag 2011-05-20 20:50:16

回答

60

你可以使用JavaScript关闭:

for (var i = 0; i < arr.length; i++) { 
    (function(i) { 
    // do your stuff here 
    })(i); 
} 

或者你可以只使用$.each

var arr = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]; 

$.each(arr, function(index, value) { 
    $.ajaxSetup({ cache:false }); 
    $.getJSON("NatGeo.jsp", { ZipCode: value, Radius: 
    document.getElementById("radius").value, sensor: false },  
    function(data) { 
     DrawZip(data, value); 
    } 
); 
}); 
+0

真棒,太棒了!谢谢! – user717236 2011-05-23 17:11:59

+0

这两个解决方案都是一样的,没有什么价值的,并且'$ .each'没有什么不可思议的。在这两种情况下,都使用匿名函数来创建闭包。 – eradman 2015-04-08 14:22:58

+0

优秀的答案。谢谢。 – 2016-10-21 19:19:18

5

我没看过的所有30个问题@Anurag上市,但我发现下面的回调语法似乎工作:

(function(year) { 
    return (function(data) {DrawZip(data, year);}); 
})(arr[i]) 

这取代原来的function(data)。顺便说一下,结果是随机的顺序,由于异步响应

+0

这也很好。谢谢! – user717236 2011-05-23 17:12:27

+0

非常欢迎。 :) – yitwail 2011-05-25 02:42:40

+0

你节省了我的时间。谢谢。 – seenimurugan 2016-10-20 17:30:41

3

你甚至可以省略为环支架由John Resig here提到的,我认为这种方式更具有可读性

for (var i = 0; i < arr.length; i++) (function(i) { 

    // async processing 
    setTimeout(function(){ 
     console.log(i); 
    }, i * 200); 

})(i);