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