是否可以中止同步XmlHttpRequest?

时间:2011-09-22 07:47:46

标签: javascript ajax xmlhttprequest

我编写了一个JavaScript函数,它使用XmlHttpRequest异步调用Web服务。我被要求让这个功能在呈现页面之前完成它的工作。

我以为我可以让AJAX请求同步但我不希望这会让页面挂起太长时间 - 如果没有收到回复,我想在1秒之后中止请求。< / p>

是否可以中止同步XmlHttpRequest?

4 个答案:

答案 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();