XMLHttpRequest用于查找更快的服务器

4
我有一个情况,我的网站需要通过AJAX快速从服务器检索数据。
我的网站运行在80端口上,提供普通的网页服务。我通常在8001端口运行我的AJAX服务器(我使用JSONP,这个方法很好用)。这适用于大多数用户。然而,一些用户由于本地防火墙的限制而被阻止访问高端口。
为了让那些无法在8001端口上得到响应的用户使用我的网站,我希望能够在用户无法在8001端口上获得响应时,自动回退到80端口。
我不总是使用80端口的原因是,有时人们会使用“智能”杀毒软件网关或其他应用层防火墙来拦截80端口的出站连接。这会增加几百毫秒的往返时间。我的AJAX服务需要尽量减少往返响应时间。
我使用jQuery使XMLHttpRequest的工作变得简单。我正在使用JSONP变体,这个部分可以工作——从不同的IP地址或端口拉取AJAX请求并不是问题本身。
我的想法是,在页面首次加载时,触发2个getJSON调用。一个是8001端口,另一个是80端口。两个调用都使用相同的响应处理程序。
第一个调用响应处理程序设置我的“portToUse”变量,然后继续正常功能。
如果8001端口没有被阻止,这个方法可以工作。如果8001端口被阻止,这个方法也可以工作。然而,在我的来自80端口的响应返回之前,会有大约5秒的延迟。这不是由服务器端引起的。我想消除这个延迟。
我的理论是,即使getJSON是异步的,浏览器一次只会触发一个XMLHttpRequest。它会在第一个请求返回或超时之前等待,然后再发送下一个请求。
我不确定我是否正确。如果是这样,那么有没有办法绕过这个功能,同时触发两个XMLHttpRequest?如果我错了,你有什么建议可以解决接收我的第二个响应(来自我的服务器上80端口)的延迟问题吗?任何其他建议都欢迎。
编辑: 这种行为只发生在Firefox 3和Opera 9.63中。IE7和Chrome没有出现这个延迟。
1个回答

3

AJAX调用同时发生。

我会设置全局变量var portToUse = 80(默认值),并设置一个函数,调用端口8001来获取少量数据。如果在8001上的ajax请求成功返回,则更改portToUse = 8001;

您立即开始发出的请求将在80上进行,直到您知道8001已打开。然后它会切换,所有未来的请求都将在8001上进行。

你也可以这样做:

var request = $.ajax({ 
                      type: 'POST', 
                      url: 'test.html:8001',
                      success: function(){ portToUse = 8001; }
                     });

setTimeout(function(){

    request.abort();

}, 1000);

如果请求时间超过一秒钟,我们会取消该请求,让您的请求继续使用80端口。您可以将超时值设置为任何值,具体取决于您希望允许请求尝试的时间。500代表500毫秒,以此类推...

这可能起作用。然而,如果我在Firefox中遇到的延迟仍然存在,我将会看到以下行为:req->80:20ms, req->8001->永远不会回来,2nd req->80:5020ms (因为它被超时的请求到8001所拖延), 3rd req->80:20ms,等等。这也是无法接受的。 - Krystian Cybulski
请求中的8001超时不应影响您的其他请求。我将编辑我的答案并提供另一种方法... - a432511

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接