我编写了一个JavaScript函数,它使用XmlHttpRequest异步调用Web服务。我被要求让这个功能在呈现页面之前完成它的工作。
我以为我可以让AJAX请求同步但我不希望这会让页面挂起太长时间 - 如果没有收到回复,我想在1秒之后中止请求。< / p>
是否可以中止同步XmlHttpRequest?
答案 0 :(得分:4)
你不能:
http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX sais: “同步AJAX(真正的SJAX - 同步Javascript和XML)是模态的,这意味着javascript将停止处理您的程序,直到从服务器获得结果。当请求正在处理时,浏览器被有效冻结。浏览器处理只调用警报框或提示框,它不等待来自用户的输入,而是等待远程服务器的输入“
一旦浏览器运行同步请求,它将等待它获得响应。
答案 1 :(得分:2)
首先,同步AJAX调用是邪恶的,因为它们阻止了整个JavaScript浏览器引擎(你知道)。
是否只是异步地进行调用并且如果结果晚于一秒钟后结果丢弃,则丢弃结果?如果你真的想等待结果,你仍然可以使用setTimeout()
(jQuery是为了方便,不是必需的):
var result;
var xhr = $.ajax('/url', function(response) {
result = response;
});
setTimeout(function() {
if(result) {
//AJAX call done within a second, proceed with rendering
} else {
//One second passed, no result yet, discard it and move on
xhr.abort();
}
}, 1000);
使用这种方法,您不必阻止浏览器,同时您还不必等待AJAX呼叫。
答案 2 :(得分:1)
XMLHttpRequest
支持abort
方法,您可以在此处获取有关此问题的详细信息:http://www.w3.org/TR/XMLHttpRequest/#the-abort-method
但您需要检查有多少浏览器支持它。例如,在Windows Internet Explorer 7及更高版本中引入了abort
。
在调用send()
对象的XMLHttpRequest
方法之前或之后,您可以设置一个n秒延迟的计时器,这将中断正在进行的异步操作。
答案 3 :(得分:0)
可以在IE中使用。超时属性。
以下代码为我工作
xmlhttp.open("method","url",false);
xmlhttp.timeout="time in ms";
xmlhttp.ontimeout=function(){};
xmlhttp.send();