Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

readyState 为何 DONE?

  XHR 对象的 readyState 有个名为 DONE 的状态(状态码为 4),我们通常会根据这个状态来判断一个请求的完成与否。但实际上即便状态是 DONE 也未必意味着请求成功,这仅仅是表示请求完毕而已。请求完毕不仅包含了请求成功,还包含了请求错误和连接无法建立等情况。
  当 XHR 对象请求一个跨域的资源,虽然内容会被同源策略阻止而无法访问,但是 XHR 对象依然会进入 DONE 这个状态。所以我们不仅要判断 readyState 是否为 DONE,还要判断 status 是否为 0。标准的 http status 应该是三位数才对,只有 XHR 对象默认的 status 才是 0,所以当 status 为 0 时候就意味着请求没有成功。这个状态下通常会触发 XHR 对象的 error 事件。
  不仅是跨域资源会遇到这种请求,还有域名无法解析、网络断开、TLS 无法建立等几乎所有情况都会让 readyState 进入 DONE 这个状态,并且触发 error 事件。但也有一些比较特殊的情况,比如 scheme 无法识别。当 XHR 对象遇到一个无法识别的 scheme 时将会是一个未定义行为。Chrome 对其的处理同其他情况一样,会让 readyState 进入 DONE。而 Firefox 的处理则是在 XHR 的 open 阶段就直接抛错了,并且这个错误可以被 try catch 到。
  在 onreadystatechange 事件中判断 readyState 是否为 DONE 已经是相当古老的做法了,现在越来越流行的是直接使用 onload 事件。onload 事件会考虑请求是否真的成功,也就是 status 是否非 0,或者说数据是否是由服务器响应的。只有服务器响应的数据才能称为是 load,才会触发 load 事件。 其它连服务器连接都无法建立的情况都不会触发 load 事件。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^