正确的方法来处理304未在jQuery ajax中修改

时间:2011-03-07 02:24:47

标签: jquery browser-cache

从jQuery 1.5开始,根据XMLHTTPRequest的W3C规范,ajax方法现在可以通过调用success()处理程序正确处理304 Not Modified响应。这允许您的应用程序将请求视为成功,即使服务器实际上没有返回任何数据(因为您已经缓存了最新数据)。

对于正常(未缓存)的GET请求,使用以下args调用成功处理程序:

  • 数据:{来自服务器的数据}
  • 状态:确定
  • jqXHR:
    • 状态:200
    • statusText:好的
    • responseText:{来自服务器的数据}

对于缓存的GET请求,使用以下args调用成功处理程序:

  • 数据:未定义
  • status: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 不会在成功处理程序中填充的情况,但数据arg

我必须通过我的代码库并更改所有成功处理程序(之前我在jQuery 1.4.2上,它总是返回数据,甚至从缓存中返回);所以我只是想确保我以正确的方式处理它。 (不要想要达到目的,然后意识到我应该采取另一种方式)。

2 个答案:

答案 0 :(得分:7)

我刚刚发现了我的问题中的明显缺陷......我假设数据总是文本,所以使用jqXHR.responseText优先于数据参数是有意义的。

但是在dataType是JSON,JSONP,脚本等的情况下......如果304 Not Modified响应中返回的数据返回为未定义,则需要将jqXHR.responseText从字符串转换为首先是期望的类型,例如

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

...当你真正需要的时候,你只想做这个(可能很昂贵的)转换。

有点理智,因为我想到了......数据总是会从服务器返回的(在某些情况下可能未定义为304 ...例如。服务器可以返回一些额外的text / html);这允许开发人员灵活地选择他们想要在304事件中做什么,例如

  • 显示服务器的响应(如果有)
  • 使用jqXHR.responseText
  • 完全做别的事......

答案 1 :(得分:5)

根据上下文,您可以将cache参数用于ajax请求:

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

这对我有用。