正如标题所述,我正在 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;
意味着 i
是 for
循环的局部变量。因此,在每个请求返回时都应该调用 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/