javascript - for循环中的多个ajax请求

标签 javascript ajax

正如标题所述,我正在 for 循环中发送多个 ajax 调用。数组中的每个条目一个。

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

  var request;
  if (window.XMLHttpRequest) {
    request = new XMLHttpRequest();
  } else {
    request = new ActiveXObject("Microsoft.XMLHTTP");
  }
  request.onreadystatechange=function() {
    if (request.readyState === 4 && request.status === 200) {
      outstandingRequests--;
      if (outstandingRequests === 0) { 
        //some processing would happen in here
      } else {
        //be patient as more requests need to return
      }
    }
  }
  request.open("GET","some_ajax_page.php", true);
  outstandingRequests++;
  request.send();
}

当请求发送时,outstandingRequests 会递增,收到响应时会递减。如果 OutstandingRequests 为 0,则我们已从所有请求中返回。

我的理解是,因为我已经在循环体中声明了 var request;,所以 request 仅适用于该循环的迭代。类似地,for 循环初始化中的 var i = 0; 意味着 ifor 循环的局部变量。因此,在每个请求返回时都应该调用 onreadystatechange 中声明的函数。

确实如此,但只有最后一个请求的 readystate 为 4,status 为 200,因此 outstandingRequests 永远不会递减,直到最后一个请求返回,因此永远不会将其降回 0 以进行额外处理。由于每个请求都是单独的请求,因此我希望所有请求的 readystate 都应为 4,status 为 200。

我在发布之前尝试过谷歌搜索并检查SO的答案,但大多数都包含 jQuery 或者是仅发送一个 ajax 调用的不同问题。在我的示例中,我可以看到对服务器进行的所有预期调用。

我的理解有误吗?或者我理解正确但忽略了其他东西。

提前致谢。

最佳答案

My understanding is that because I have declared var request; inside the loop body, request will be local to only that iteration of the loop.

没有。 var 声明一个具有函数级别作用域的变量。

您需要 let ( limited support ) 来实现 block 级别范围。

将循环体移至函数中,然后从循环内部调用该函数。

关于javascript - for循环中的多个ajax请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31609011/

相关文章:

php - 如果动态字段为空,则阻止表单提交....Php/Jquery/Ajax

javascript - 通过引用或值传递的变量(说明)

javascript - 将 JSON 数据保存到服务器上

javascript - Dynamics CRM 2015 Online : SubGrid's control. SetParameter 方法不可用

ajax - 通过 View 下拉菜单过滤 Controller 中的数据

此特定实例中的 javascript 变量范围

javascript - 为所选链接的所有级别的父级添加不同的类

javascript - 循环数字序列中两个数字之间的距离

php - 如何用php开发neteller Direct API?

javascript - 算法,Automagic Ajax