2011-09-22 66 views
5

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

我想我可以使AJAX请求同步,但我不想让这个页面挂起时间过长 - 如果没有收到响应,我想在1秒之后中止请求。

是否有可能中止同步XmlHttpRequest?

+0

问题听起来是“我可以设置同步XMLHttpRequest的客户端脚本超时”? –

回答

4

您不能:

http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX赛斯: “同步AJAX(真SJAX - 同步JavaScript和XML)是模式,这意味着,直到结果已经从服务器获取的JavaScript将停止处理程序当请求正在处理时,浏览器被有效地冻结,浏览器将该呼叫视为警告框或提示框,只是它不等待来自用户的输入,而是通过远程服务器的输入“

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

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呼叫。

+0

“同步AJAX调用是邪恶的” - 取决于,因为有时需要阻止整个JavaScript浏览器引擎:) –

1

XMLHttpRequest支持abort方法,你可以在这里得到更多的细节吧:http://www.w3.org/TR/XMLHttpRequest/#the-abort-method

但你需要检查多少browserы支持。例如,在Windows Internet Explorer 7及更高版本中引入了abort

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

0

它可能在IE.Use超时属性。下面

代码为我工作

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