【发布时间】:2013-12-17 06:12:04
【问题描述】:
我正在尝试根据有关 ajax URL 的信息检查许多项目。但是当我在浏览器中运行此功能时,内存使用量超过 2 gigs,然后浏览器崩溃(Chrome、Firefox)。我究竟做错了什么? items 变量非常大 - >200 000 并且还包含一些大字符串。
var items = [1,2,3,4,5,6,7,8,9,10,...,300000]
var activeItems = {}
function loopAjax(){
for (i=0; i < items.length; i++) {
var currItem = items[i];
var request = new XMLHttpRequest();
var found = 0
request.open("GET", "/item=" + currItem);
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
var response = JSON.parse(request.responseText);
var active = response[0].active;
if (active) {
console.log("FOUND ACTIVE! " + currItem);
activeItems[found] = {"active": true, "item": currItem};
found++;
}
}
}
request.send();
}
}
【问题讨论】:
-
...300000 是问题所在。您需要重新设计解决此问题的方式
-
这是一个糟糕的设计。想想你在做什么。向服务器发出 200,000 个请求!?您没有任何延迟,因此您只需强制浏览器将呼叫排队即可。没有休息。服务器应该在一个调用中处理多个项目。不止一个。您需要考虑排队呼叫。
-
哇,对服务器的请求实在是太多了。为什么会有这么多请求?
-
相关:Javascript closure inside loops - simple practical example。
vars 在 JavaScript 中是 program 或function-范围,而不是块范围。因此,您只声明了 1 个request变量供for循环的所有迭代共享。而且,由于 Ajax 是异步的,request的值会在调用onreadystatechange之前发生变化,并且可以验证任何requests 的状态。 -
... 这意味着请求状态/状态可能永远不会被满足。
标签: javascript jquery ajax xmlhttprequest