快速发送时不接收异步AJAX请求

时间:2012-12-31 03:38:32

标签: javascript ajax asynchronous xmlhttprequest

我的脚本正在向页面(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请求,那么响应将被忽略或丢弃。

我做错了什么/误解?

2 个答案:

答案 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请求。

Fiddle

请注意,由于每个浏览器固有的并发ajax调用的最大限制,过于频繁的调用可能会导致速度减慢。
虽然现代浏览器有一个相当公平的限制和非常好的并行性,所以只要你只提取一个小的JSON对象,现代浏览器即使在使用拨号时也应该能够跟上。

上次我创建了一个ajax轮询脚本,我会在前一个请求的成功处理程序中启动一个新请求,而不是使用一个间隔,以便最小化ajax调用。不确定此逻辑是否适用于您的应用。