我的情况是我的网站需要通过AJAX从我的服务器快速检索数据。
我的网站在端口80上运行,提供普通网页。我通常在端口8001上运行我的AJAX服务器(我使用JSONP,这很好)。这适用于大多数用户。但是,某些用户被本地防火墙阻止了高端口。
为了允许端口8001上有传出连接的人被阻止使用我的网站,我想回到端口80,以防用户无法在端口8001上获得响应。
我一直不使用端口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不会出现这种延迟。
答案 0 :(得分:3)
AJAX调用同时发生。
我会设置全局var portToUse = 80
(默认值)并设置一个在端口8001上调用的函数来获取非常少量的数据。如果ajax请求在8001上成功返回,则更改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毫秒,依此类推......