我的脚本正在向页面(http://example.org/getlisting/
)发送GET请求,然后该页面将使用JSON对象进行响应。 ({"success":true, "listingid":"123456"}
)
以下是一个示例代码段:
var listingAjax = new XMLHttpRequest();
listingAjax.addEventListener("load", listingCallback, false);
function listingCallback(event) {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
}
listingAjax.open("GET", "http://example.org/getlisting/", true);
listingAjax.send();
足够简单。该脚本也很完美!当我想这样做时会出现问题:
var listingAjax = new XMLHttpRequest();
listingAjax.addEventListener("load", listingCallback, false);
function listingCallback(event) {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
}
window.setInterval(function() {
listingAjax.open("GET", "http://example.org/getlisting/", true);
listingAjax.send();
}, 250);
我想象应该发生的是我的脚本会创建一个稳定的GET请求流,然后发送到服务器然后服务器响应每个请求。然后,我的脚本将收到服务器的响应并将它们发送到回调。
更确切地说,我说这个脚本运行5秒钟,我的脚本在那段时间内向服务器发送了20个GET请求。我希望我的回调(listingCallback
)也会被调用20次。
问题是,事实并非如此。几乎看来,如果我在收到服务器的响应之前发出了两个GET请求,那么响应将被忽略或丢弃。
我做错了什么/误解?
答案 0 :(得分:2)
许多浏览器每台服务器都有内置的最大开放HTTP连接数。你可能会撞墙吗?
以下是Mozilla的示例,但大多数浏览器都应该包含以下内容:http://kb.mozillazine.org/Network.http.max-connections-per-server
关于Chrome的早期问题: Increasing Google Chrome's max-connections-per-server limit to more than 6
如果您有Windows,请查看Fiddler之类的工具 - 您可能会看到是否实际发出了所有请求,或者浏览器是否正在排队/查杀其中一些请求。
答案 1 :(得分:1)
当一个进程正在进行时,您不能重复使用相同的XMLHttpRequest
对象open
新连接,否则会导致突然abort
离子(在Chrome中测试)。为每个调用使用一个新的XMLHttpRequest
对象将解决该问题:
function listingCallback(event) {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
}
window.setInterval(function() {
var listingAjax = new XMLHttpRequest();
listingAjax.addEventListener("load", listingCallback, false);
listingAjax.open("GET", "http://example.org/getlisting/", true);
listingAjax.send();
}, 250);
这将很好地为每个间隔排队一个新的ajax请求。
请注意,由于每个浏览器固有的并发ajax调用的最大限制,过于频繁的调用可能会导致速度减慢。
虽然现代浏览器有一个相当公平的限制和非常好的并行性,所以只要你只提取一个小的JSON对象,现代浏览器即使在使用拨号时也应该能够跟上。
上次我创建了一个ajax轮询脚本,我会在前一个请求的成功处理程序中启动一个新请求,而不是使用一个间隔,以便最小化ajax调用。不确定此逻辑是否适用于您的应用。