2011-03-07 46 views
16

從jQuery 1.5開始,ajax方法現在可以根據XMLHTTPRequest的W3C規範調用success()處理程序正確處理304個Not Modified響應。這允許您的應用程序將請求視爲成功,即使服務器實際上沒有返回任何數據(因爲您已經有最新的數據緩存)。適當的方式來處理304在jQuery中未修改ajax

對於正常(非高速緩存)GET請求時,成功處理程序被調用,以下ARGS:

  • 數據:{來自服務器的數據}
  • 狀態:OK
  • jqXHR:
    • 狀態:200
    • 狀態文本:OK
    • 的responseText:{從服務器的數據}

對於緩存的GET請求,成功處理程序調用以下ARGS:

  • 數據:不確定
  • 狀態:notmodified
  • jqXHR:
    • 狀態:304
    • statusText:notmodified
    • 的responseText:{從緩存中的數據}

(至少,這是它是如何在IOS 4.2返回,對於通過清單文件使用的應用程序緩存一個web應用程序。我假設這對大多數平臺/瀏覽器上的一般瀏覽器緩存是一致的)。

您可以看到,只有請求爲200 OK時才填充「data」參數;因爲jqXHR.responseText總是填充數據,而不管數據是來自服務器(200 OK)還是來自緩存(304 Not Modified)。

鑑於這種情況,在大多數GET請求中,您的成功處理程序將希望對您獲取的數據執行某些操作,而不管它來自何處,因此您的成功代碼似乎最適合始終使用jqXHR.responseText,而不是做這樣的事情:

if ("notmodified" === status) { 
    // do something with jqXHR.responseText 
} else { 
    // do something with data 
} 

或者是有過的情況下,當jqXHR.responseText 不會在成功處理程序來填充,但數據精氨酸

我必須通過我的代碼庫並更改所有成功處理程序(以前我在jQuery 1.4.2上,它始終從緩存中返回數據);所以我只想確保我以正確的方式處理它。 (不要想到最後,然後意識到我應該以另一種方式做到這一點)。

回答

7

我剛剛在我的問題中發現了明顯的缺陷....我假設數據總是文本,所以使用jqXHR.responseText優先於數據參數是有意義的。

但是在dataType爲JSON,JSONP,腳本等的情況下......如果在304 Not Modified響應中返回的數據返回爲未定義,則需要將jqXHR.responseText從字符串轉換爲首先需要的類型,例如。

if (data === undefined) { 
    data = $.parseJSON(jqXHR.responseText); 
} 

...並且您只想在您需要的時候這樣做(可能很貴)。

有點有道理,現在我想起它...數據總是會從服務器返回(在某些情況下,可能而不是未定義爲304 ...例如服務器可能返回一些額外的文本/ HTML);這使得開發人員能夠靈活地選擇他們想要在304中執行的操作,例如。

  • 顯示來自服務器的響應(如果有的話)
  • 使用jqXHR.responseText
  • 做別的東西完全...
+1

我目前正在處理一個項目上的這個問題......有點令人驚訝的是,jQuery不會自動爲您填充數據參數。我不同意你的邏輯......我敢肯定,HTTP標準需要一個空的響應主體304未修改的響應,所以服務器不應該發回任何額外的數據......不應該有任何含糊不清。 – 2012-01-09 22:40:41

+0

在我的情況下,jqXHR.responseText是未定義的,也有一個響應文本:( – drogon 2013-10-01 17:40:22

4

根據上下文,您可以使用cache參數到ajax請求:

$.ajax({ 
    url: ".....", 
    dataType: "json", 
    type: "GET", 
     cache: false, 
    contentType: "application/json", 
     success: function (data, textStatus) { 
      console.log("RECV: " + data); 
     } 
    }); 

這對我有用。