正如标题所述,我在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
意味着i
是for
循环的本地。因此,当每个请求返回时,应调用在onreadystatechange
声明的函数。
这是真的,但是只有最后一个请求的readystate
为4,status
为200,所以outstandingRequests
永远不会递减,直到最后一个请求返回,因此永远不会退回到0以进行额外处理。由于每个请求都是单独的请求,因此我希望所有请求的readystate
为4,status
为200.
我在发布之前尝试使用Google搜索和检查 SO 以获取答案,但大多数都包含jQuery,或者是只发送一个ajax调用的不同问题。在我的例子中,我可以看到所有预期的调用都发送到服务器。
我的理解错了吗?或者我是否正确理解但忽略了别的东西。
提前致谢。
答案 0 :(得分:2)
我的理解是因为我已经声明了var请求;在循环体内部,请求只对循环的迭代是本地的。
没有。 var
声明一个具有功能级别范围的变量。
阻止级别范围需要let
(limited support)。
将循环体移动到一个函数中,然后从循环内部调用该函数。