如标题所示,我正在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();
}
发送请求后,当收到响应时,未完成的请求将递增或递减。如果未完成请求为0,那么我们已经从所有请求中返回了。
我的理解是,因为我已var request;
在循环体内声明,request
因此仅在该循环迭代中是局部的。类似地var i = 0;
,在for
循环中,初始化将意味着i
局部于for
循环。因此,onreadystatechange
在每个请求返回时,应调用在处声明的函数。
这是正确的,但是只有最后一个请求的areadystate
等于4,而astatus
等于200,所以outstandingRequests
直到最后一个请求返回之前,它才不会递减,因此永远也不会使其减少到0以进行额外的处理。由于每个请求都是一个单独的请求,因此我希望所有请求都应达到readystate
4的astatus
和200的a。
我尝试过谷歌搜索并在发布之前检查SO的答案,但是大多数都包含jQuery,或者是不同的问题,其中仅发送了一个ajax调用。在我的示例中,我可以看到对服务器的所有预期调用。
我的理解错了吗?还是我理解正确但是却忽略了其他东西。
提前致谢。
我的理解是因为我已经声明了var request; 在循环体内,请求仅在循环的该迭代中是本地的。
No.var
声明一个具有函数级作用域的变量。
您需要let
(有限支持)块级范围。
将循环的主体移到一个函数中,然后从循环内部调用该函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句