为Ajax设置超时(jQuery)

$.ajax({ url: "test.html", error: function(){ //do something }, success: function(){ //do something } }); 

有时候successfunction很好,有时候不行。

如何为这个Ajax请求设置超时? 例如,3秒钟,如果时间到了,则显示错误。

问题是,ajax请求冻结块直到完成。 如果服务器停机一段时间,它将永远不会结束。

请阅读$.ajax 文档 ,这是一个涵盖的主题。

 $.ajax({ url: "test.html", error: function(){ // will fire when timeout is reached }, success: function(){ //do something }, timeout: 3000 // sets timeout to 3 seconds }); 

通过访问error: function(jqXHR, textStatus, errorThrown)选项的textStatus参数,可以看到发生了什么types的错误。 选项有“超时”,“错误”,“中止”和“parsing错误”。

下面是一些示例,演示如何在jQuery的新旧范例中设置和检测超时。

现场演示

承诺与jQuery 1.8 +

 Promise.resolve( $.ajax({ url: '/getData', timeout:3000 //3 second timeout }) ).then(function(){ //do something }).catch(function(e) { if(e.statusText == 'timeout') { alert('Native Promise: Failed from timeout'); //do something. Try again perhaps? } }); 

jQuery 1.8+

 $.ajax({ url: '/getData', timeout:3000 //3 second timeout }).done(function(){ //do something }).fail(function(jqXHR, textStatus){ if(textStatus === 'timeout') { alert('Failed from timeout'); //do something. Try again perhaps? } });​ 

jQuery <= 1.7.2

 $.ajax({ url: '/getData', error: function(jqXHR, textStatus){ if(textStatus === 'timeout') { alert('Failed from timeout'); //do something. Try again perhaps? } }, success: function(){ //do something }, timeout:3000 //3 second timeout }); 

注意textStatus参数(或者jqXHR.statusText )会让你知道错误是什么。 如果您想知道失败是由超时引起的,这可能会很有用。

错误(jqXHR,textStatus,errorThrown)

如果请求失败,将调用一个函数。 该函数接收三个参数:jqXHR(在jQuery 1.4.x中,XMLHttpRequest)对象,一个描述发生的错误types的string,以及一个可选的exception对象(如果发生的话)。 第二个参数(除了null)的可能值是“超时”,“错误”,“中止”和“parsing错误”。 发生HTTP错误时,errorThrown会收到HTTP状态的文本部分,如“未find”或“内部服务器错误”。 从jQuery 1.5开始,错误设置可以接受一组函数。 每个函数都会依次调用。 注意:此处理程序不会被调用用于跨域脚本和JSONP请求。

src: http : //api.jquery.com/jQuery.ajax/

你可以使用像这样的ajax选项的timeout设置:

 $.ajax({ url: "test.html", timeout: 3000, error: function(){ //do something }, success: function(){ //do something } }); 

阅读所有有关这里的ajax选项: http : //api.jquery.com/jQuery.ajax/

请记住,发生超时时, error处理程序被触发,而不是success处理程序:)

使用全function的.ajax jQueryfunction。 比较与https://stackoverflow.com/a/3543713/1689451为例。;

没有testing,只是将您的代码与引用的SO问题合并:

 target = $(this).attr('data-target'); $.ajax({ url: $(this).attr('href'), type: "GET", timeout: 2000, success: function(response) { $(target).modal({ show: true }); }, error: function(x, t, m) { if(t==="timeout") { alert("got timeout"); } else { alert(t); } } });​