Web 技术研究所

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

XHR 的 status 并不等价于 HTTP 状态码

  之前写的程序在 XHR 的处理时我总是喜欢判断 status < 400 表示成功,因为我认为对于浏览器而言 1xx 和 3xx 是不会暴露出来的,剩下的就只有 200 了。然而,在后来的程序中,我又傻逼地把 onload 和 onerror 的处理函数定义为同一个,结果造成了 status = 0 被认为是成功状态。
  XHR 对象的 status 默认是 0,只有和服务器交互以后才会变成 HTTP 状态码。而如果 XHR 对象出现一个连接级别的错误,走 onerro 方向时 status 会依然停留在 0 上。所以我之前的代码中用 status < 400 来判断成功就出问题了。比如
<script> let xhr = new XMLHttpRequest(); xhr.open('GET', 'http://hehe'); xhr.onerror = function() { alert(xhr.status); }; xhr.send(); </script>   这个代码中 http://hehe 是一个无法建立连接的 URL,会让 xhr 走到 onerror 中,于是访问 xhr.status 将得到 0。
  将 status < 400 用来判断请求的成功状态这件事本身是没有问题的,对 onerror 和 onload 使用同一的处理这件事本身也是没问题的。然而这两件事一旦放在一起就会出问题。
  这个问题的根本原因在于,我将 status 和 HTTP 状态码的概念混淆了。实际上它们并不完全等价,只是 status 在成功方向和 HTTP 状态码能够对应而已。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^