【发布时间】: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; 将意味着i 是for 循环的本地。因此,应在每个请求返回时调用在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