将索引从 for 循环传递给 ajax 回调函数(JavaScript)

IT技术 javascript ajax loops callback closures
2021-02-16 08:02:04

我有一个包含 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 数组的每次迭代传递给回调函数?

3个回答

您可以使用 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);
    }
  );
});
优秀的答案。谢谢你。
2021-04-23 08:02:04
这两种解决方案是一样的,没什么值得的,也没有什么神奇之处$.each在这两种情况下,都使用匿名函数来创建闭包。
2021-04-24 08:02:04

我没有阅读@Anurag 列出的所有 30 个问题,但我发现以下回调语法似乎有效:

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

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

你节省了我的时间。谢谢。
2021-04-27 08:02:04

您甚至可以省略John Resig 在这里提到的 for 循环括号,我认为这种方式更具可读性

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

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

})(i);