我有一个包含ajax调用的for循环,我正在尝试确定将索引从for循环传递给回调函数的最佳方法。这是我的代码:
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数组的每次迭代传递给回调函数?
答案 0 :(得分:67)
您可以使用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);
}
);
});
答案 1 :(得分:5)
我没有阅读@Anurag列出的所有30个问题,但我发现以下回调语法似乎有效:
(function(year) {
return (function(data) {DrawZip(data, year);});
})(arr[i])
这取代了原来的function(data)
。顺便提一下,由于异步响应,结果是随机顺序
答案 2 :(得分:3)
你甚至可以省略John Resig here提到的for-loop括号,我觉得这种方式更具可读性
for (var i = 0; i < arr.length; i++) (function(i) {
// async processing
setTimeout(function(){
console.log(i);
}, i * 200);
})(i);