对于正常(未缓存)GET请求,使用以下参数调用成功处理程序:
> data:{来自服务器的数据}
>状态:OK
> jqXHR:
状态:200
> statusText:OK
> responseText:{来自服务器的数据}
对于缓存的GET请求,使用以下参数调用成功处理程序:
> data:undefined
状态:未修改
> jqXHR:
>状态:304
> statusText:未修改
> responseText:{来自缓存的数据}
(至少这是如何在IOS 4.2中返回,对于通过清单文件使用应用程序缓存的网络应用程序,我认为这在大多数平台/浏览器上的一般浏览器缓存是一致的)。
您可以看到仅当请求为200 OK时,“数据”参数才会被填充;其中,由于jqXHR.responseText始终填充数据,无论该数据是来自服务器(200 OK)还是来自缓存(304未修改)。
鉴于在大多数GET请求中,您的成功处理程序将要使用您所获得的数据执行某些操作,无论它来自哪里,似乎最成功的代码总是使用jqXHR.responseText,而不是这样做:
if ("notmodified" === status) { // do something with jqXHR.responseText } else { // do something with data }
或者有没有一个情况下,jqXHR.responseText不会被填充在成功处理程序,但数据arg会吗?
我必须经过我的代码库,并改变所有成功的处理程序(以前我在jQuery 1.4.2,它总是返回数据,甚至从缓存);所以我只是想确保我正确地处理它。 (不要不要结束,然后意识到我应该这样做)。
解决方法
但是在dataType为JSON,JSONP,脚本等的情况下,如果304未修改响应中返回的数据未定义,则需要将jqXHR.responseText从字符串转换为所需类型,例如
if (data === undefined) { data = $.parseJSON(jqXHR.responseText); }
…而且,您只需要真正做到这一点(潜在的昂贵)转换。
Kinda现在有意义,我认为它…数据总是会是从服务器回来的(在某些情况下,可能不会对304 …未知)…例如,服务器可能会返回一些额外的文本/ HTML );这允许开发人员灵活地选择在304的情况下想要做什么,例如。
>显示服务器的响应(如果有的话)>使用jqXHR.responseText>做别的事情…