将for循环的索引传递给ajaxcallback函数(JavaScript)

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

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

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

你可以使用javascriptclosures:

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

我没有阅读@Auurag列出的所有30个问题,但我发现似乎工作的以下callback语法:

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

这取代了原来的function(data) 。 顺便说一句,由于asynchronous响应,结果是随机的

你甚至可以省略John Resig提到的for-loop括号,我认为这种方式更具可读性

 for (var i = 0; i < arr.length; i++) (function(i) { // async processing setTimeout(function(){ console.log(i); }, i * 200); })(i);