正确的方法来处理304未在jQuery ajax中修改
从jQuery 1.5开始,根据XMLHTTPRequest的W3C规范,ajax方法现在通过调用success()处理程序正确处理304 Not Modified响应。 这允许您的应用程序将请求视为成功,即使服务器实际上没有返回任何数据(因为您已经缓存了最新数据)。
对于正常(未缓存)的GET请求,使用以下args调用成功处理程序:
- data:{来自服务器的数据}
- 状态:好的
- jqXHR:
- 状态:200
- statusText:好的
- responseText:{来自服务器的数据}
对于缓存的GET请求,使用以下args调用成功处理程序:
- 数据:未定义
- 状态:未修改
- 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上,它总是返回数据,甚至从缓存中返回); 所以我只是想确保我以正确的方式处理它。 (不要想要达到目的,然后意识到我应该以另一种方式做到这一点)。
我刚刚发现了我的问题中的明显缺陷….我假设数据总是文本,所以使用jqXHR.responseText优先于数据参数是有意义的。
但是在dataType是JSON,JSONP,脚本等的情况下…如果在304 Not Modified响应中返回的数据返回为未定义,则需要首先将字符串中的jqXHR.responseText转换为所需类型,例如。
if (data === undefined) { data = $.parseJSON(jqXHR.responseText); }
…当你真的需要时,你只想做这个(可能很昂贵的)转换。
Kinda现在有意义了,我想到了……数据总是会从服务器返回的(在某些情况下可能不会为304定义…例如。服务器可以返回一些额外的文本/ html ); 这允许开发人员灵活地选择他们想要在304的情况下做什么,例如。
- 显示服务器的响应(如果有)
- 使用jqXHR.responseText
- 完全做别的事……
根据上下文,您可以将cache
参数用于ajax请求:
$.ajax({ url: ".....", dataType: "json", type: "GET", cache: false, contentType: "application/json", success: function (data, textStatus) { console.log("RECV: " + data); } });
这对我有用。