是否可能中止同步XmlHttpRequest ?

Is it possible to abort a synchronous XmlHttpRequest?

本文关键字:同步 XmlHttpRequest 是否      更新时间:2023-09-26

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

我认为我可以使AJAX请求同步,但我不希望这使页面挂起太长-我想在1秒后中止请求,如果没有收到响应。

是否有可能中止同步XmlHttpRequest?

你不能:

http://www.hunlock.com/blogs/Snippets _Synchronous_AJAX知道:同步AJAX(实际上是sajax——同步Javascript和XML)是模态的,这意味着Javascript将停止处理您的程序,直到从服务器获得结果。在处理请求时,浏览器实际上被冻结了。浏览器将调用视为警告框或提示框,只是它不等待用户的输入,而是等待远程服务器的输入"

一旦浏览器运行同步请求,它将等待直到得到响应。

首先,同步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调用。

XMLHttpRequest支持abort方法,您可以在这里获得更多详细信息:http://www.w3.org/TR/XMLHttpRequest/#the-abort-method

但是你需要检查有多少浏览器支持它。例如,在Windows Internet Explorer 7及以上版本中引入了abort

在调用XMLHttpRequest对象的send()方法之前或之后,您可以设置一个n秒延迟的计时器,该计时器将中断正在进行的异步操作。

这在IE中是可能的。使用timeout属性

下面的代码为我工作

xmlhttp.open("method","url",false);
xmlhttp.timeout="time in ms";
xmlhttp.ontimeout=function(){};
xmlhttp.send();