for循环中的多个ajax请求

时间:2015-07-24 11:08:20

标签: 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只对循环的迭代是局部的。同样,var i = 0;循环初始化中的for意味着ifor循环的本地。因此,当每个请求返回时,应调用在onreadystatechange声明的函数。

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

我在发布之前尝试使用Google搜索和检查 SO 以获取答案,但大多数都包含jQuery,或者是只发送一个ajax调用的不同问题。在我的例子中,我可以看到所有预期的调用都发送到服务器。

我的理解错了吗?或者我是否正确理解但忽略了别的东西。

提前致谢。

1 个答案:

答案 0 :(得分:2)

  

我的理解是因为我已经声明了var请求;在循环体内部,请求只对循环的迭代是本地的。

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

阻止级别范围需要letlimited support)。

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