2011-03-07 169 views
136
$.ajax({ 
    url: "test.html", 
    error: function(){ 
     //do something 
    }, 
    success: function(){ 
     //do something 
    } 
}); 

有時success函數有效,有時不行。ajax設置超時(jQuery)

如何爲此ajax請求設置超時?例如,3秒鐘,如果時間到了,然後顯示錯誤。

問題是,ajax請求凍結塊直到完成。如果服務器停機一段時間,它將永遠不會結束。

+2

你需要一個','那裏後'}'。 – pimvdb

+2

看看這個> http://stackoverflow.com/questions/12930759/how-to-call-a-jquery-function-onload-with-some-delay/12930892#12930892 –

+0

可能重複[jQuery $ .ajax超時設置](http://stackoverflow.com/questions/3543683/jquery-ajax-timeout-setting) – nathanchere

回答

226

請閱讀$.ajaxdocumentation,這是一個涵蓋的主題。

$.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參數拋出。選項有「超時」,「錯誤」,「中止」和「解析錯誤」。

+3

關於捕捉超時錯誤http://stackoverflow.com/questions/3543683/determine-if-ajax-error-is-a-timeout –

+1

只是似乎沒有爲我工作,超時:1,證實它正在通過,只是永不超時 – PandaWood

92

下面是一些示例,演示如何在jQuery的新舊範例中設置和檢測超時。

Live Demo

承諾與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)對象,描述發生的 錯誤類型的字符串以及可選的異常對象(如果發生)。 第二個參數(除了null)的可能值是「超時」, 「錯誤」,「中止」和「parsererror」。發生HTTP錯誤時, errorThrown收到HTTP狀態的文本部分,例如 「未找到」或「內部服務器錯誤」。從jQuery 1.5開始,錯誤 設置可以接受一組函數。每個函數依次被稱爲 。注意:此處理程序不針對跨域腳本和JSONP請求調用。

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

+0

'$ .ajax()。fail()'和'$ .ajax()。error( )'? –

+1

@GarciaWebDev - 請參閱[調用jQuery ajax - .fail vs.:error](http://stackoverflow.com/q/13168572/402706) –

+3

+1包含jQuery 1.8+。對類似問題的大多數其他答案僅包括來自<的成功/錯誤。 – brandonscript

17

你可以在這樣的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處理程序:)

2

使用全功能的.ajax jQuery功能。例如, 與https://stackoverflow.com/a/3543713/1689451進行比較。

未經測試,只是合併與引用的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); 
     } 
    } 
});​ 
+0

H-Bahrami和RudolfMühlbauer感謝您的回覆,但我是新的阿賈克斯,所以請澄清通過我的代碼...因爲我已經看到這些答案,但我不知道發生了什麼事..所以請幫助我... – 2012-10-18 07:44:55

+0

謝謝,但它不工作.. – 2012-10-18 08:18:53

+0

我怎麼能通過.load()?它有可能與否? – 2012-10-18 10:02:28