2012-12-31 57 views
0

我的脚本发送一个GET请求一个页面(http://example.org/getlisting/)和页面,反过来,响应背部采用了JSON对象。 ({"success":true, "listingid":"123456"}没有收到异步AJAX请求发送时快速

下面是一个例子片断:

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

你在哪些浏览器中看到这种行为?我不确定它为什么会发生,但我想知道它是否是浏览器特定的。 – MJD

+0

这是谷歌浏览器。因为我计划在将来(明年有一段时间)将此脚本转换为NodeJS应用程序,因此我计划将其作为特定于此的脚本) – NessDan

回答

1

您不能重复使用同一个XMLHttpRequest对象open正在进行一个新连接,否则会导致一个突变(在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调用。不知道这个逻辑是否适用于你的应用程序。

+1

它工作正常!有效!有效!你不知道我一直在搞这个东西多久了!非常感谢你的回答,我很感激! “我有没有告诉过你你是我的英雄?” :) – NessDan

+0

哈哈没问题。 '=]' –

2

许多浏览器都有每个服务器的最大打开HTTP连接数。你可能撞到那堵墙了?

下面是从Mozilla的一个例子,但大多数的浏览器应该是这样的建在:关于铬http://kb.mozillazine.org/Network.http.max-connections-per-server

前面一个问题: Increasing Google Chrome's max-connections-per-server limit to more than 6

如果您有Windows,看看喜欢的工具提琴手 - 你可能会看到所有的请求是否真的被发出,或者浏览器是排队/杀死其中的一些。

+0

是的。这个。 @NessDan,每一刻的GET请求都很多(太多)。如果您需要实时信息,请考虑使用长查询或Web套接字等持久连接的其他解决方案。 – vcsjones

+0

谢谢你,谢天谢地,情况并非如此(我不知道GET请求是否也算作连接。) – NessDan