【问题标题】:multiple ajax requests in for loopfor循环中的多个ajax请求
【发布时间】:2015-07-24 11:08:19
【问题描述】:

正如标题所述,我在 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();
}

当发送请求时,未完成的请求在收到响应时递增和递减。如果 pendingRequests 为 0,那么我们已经从所有请求中返回。

我的理解是,因为我在循环体中声明了var request;,所以request 将只对循环的该迭代是本地的。同样,for 循环初始化中的var i = 0; 将意味着ifor 循环的本地。因此,应在每个请求返回时调用在onreadystatechange 声明的函数。

这是正确的,但是只有最后一个请求的 readystate 为 4,status 为 200,因此在最后一个请求返回之前,outstandingRequests 永远不会递减,因此永远不会让它回到 0额外的处理。由于每个请求都是一个单独的请求,我希望所有请求都应该达到 4 的 readystate 和 200 的 status

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

我的理解错了吗?还是我理解正确但忽略了其他内容。

提前致谢。

【问题讨论】:

  • 你想让 ajax 调用同步,这样下一次调用将等到第一次调用完成,否则使用 ajaxq
  • 没必要,昆汀有正确的答案——javascript没有块作用域,它有函数作用域
  • @KarthickKumar — 不,不要那样做。 xhr.spec.whatwg.org/#sync-warning
  • @Quentin,感谢更新
  • 检查这个可能对你有帮助stackoverflow.com/questions/12317887/…

标签: javascript ajax


【解决方案1】:

我的理解是因为我声明了var request;在循环体中,请求将只对循环的该迭代是本地的。

没有。 var 声明了一个具有 function 级别范围的变量。

级别范围需要let (limited support)。

将循环体移动到一个函数中,然后从循环内部调用该函数。

【讨论】:

  • 谢谢,但似乎 let 块级支持已被放弃。
  • @Chris — 你需要明确声明你也在使用 JS 1.7。将循环体移动到一个函数中。
  • 现在将主体移动到函数中可以使我的代码按预期反应。谢谢,也为消除我的误解。我确实赞成你的回答,但我没有声誉,所以它没有显示。
猜你喜欢
  • 2017-08-08
  • 2010-12-14
  • 2016-10-15
  • 2019-03-24
  • 1970-01-01
  • 2012-09-24
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多