為jQuery的$.ajax設定超時時間

呂大豹發表於2013-10-22

  jQuery的ajax模組封裝了非常強大的功能,有時候我們在傳送一個ajax請求的時候希望能有一個超時的時間,想讓程式在一段時間請求不到資料時做出一些反饋。幸運的是jQuery為我們提供了這樣的引數:timeout。今天試了一下,做個記錄。

  首先在試驗之前,有一個一直搞不明白的東西,那就是預設的超時時間是多少?這個配置在到底在什麼地方設定。jQuery中?還是apache中?PHP中?

  經過一番搜尋,暫得到如下結論:

  ①jQuery沒有預設的超時時間,只可以通過引數來配置;

  ②apache2的預設超時時間是300秒,但是我在httpd.conf中設定Timeout 10,壓根沒起到作用,不明白是怎麼回事

  ③php.ini中,只找到一個max_execution_time來配置指令碼最長執行時間,貌似也沒什麼關係

  智商捉急。。。哪位高手知道,一定告訴一下我啊~~

  下面來看jQuery中的timeout引數,值為Number型別,單位為毫秒。為了在超時的時候執行我們定義好的處理函式,可以把它放在error引數中,如下程式碼:

$.ajax({
    url : 's.php',
    timeout : 3000,
    error : function(xhr,textStatus){
      console.log('error:'+textStatus);
    },
   });

  s.php中的內容為sleep(100)。這樣在3秒後會輸出error:timeout,textStatus即為錯誤的內容。這個還是很用的,如果你的error函式中還要進行其他處理,為了不與超時混在一起,可以這麼寫:

error : function(xhr,textStatus){
      if(textStatus=='timeout'){
        //處理超時的邏輯
      }
      else{
        //其他錯誤的邏輯
      }
    }

  還可以把函式寫在complete中,因為無論success還是error,complete函式都會執行。

  這下就可以輕鬆為超時指定動作了。不過在手工之前呢我還要小小的闢謠一下,因為在網上搜尋文章的時候,有人如此描述timeout引數:會覆蓋掉全域性的設定。看到這句我頓時菊花一緊,難道我在這裡設一次,頁面上再用$.ajax的時候都會在3秒後超時?跑去官網一看文件,原句子是這麼寫的:“This will override any global timeout set with$.ajaxSetup().”,原來是會覆蓋掉$.ajaxSetup()中的設定,如果我壓根就沒用$.ajaxSetup()這個函式,便什麼事都沒有。

相關文章