正确的处理方式304没有在jQuery ajax中修改

前端之家收集整理的这篇文章主要介绍了正确的处理方式304没有在jQuery ajax中修改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从jQuery 1.5开始,ajax方法现在可以通过调用success()处理程序正确处理304 Not Modified响应,按照XMLHTTPRequest的W3C规范。这样,即使服务器实际上没有返回任何数据(因为您已经拥有最新的数据缓存),您的应用程序可以将请求视为成功。

对于正常(未缓存)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,它总是返回数据,甚至从缓存);所以我只是想确保我正确地处理它。 (不要不要结束,然后意识到我应该这样做)。

解决方法

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

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

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

…而且,您只需要真正做到这一点(潜在的昂贵)转换。

Kinda现在有意义,我认为它…数据总是会是从服务器回来的(在某些情况下,可能不会对304 …未知)…例如,服务器可能会返回一些额外的文本/ HTML );这允许开发人员灵活地选择在304的情况下想要做什么,例如。

>显示服务器的响应(如果有的话)>使用jqXHR.responseText>做别的事情…

猜你在找的jQuery相关文章