XMLHttpRequest 中不同的就绪状态是啥意思,我该如何使用它们?

Posted

技术标签:

【中文标题】XMLHttpRequest 中不同的就绪状态是啥意思,我该如何使用它们?【英文标题】:What do the different readystates in XMLHttpRequest mean, and how can I use them?XMLHttpRequest 中不同的就绪状态是什么意思,我该如何使用它们? 【发布时间】:2010-10-12 13:52:35 【问题描述】:

XMLHttpRequest 有 5 个 readyStates,我只使用其中的 1 个(最后一个,4)。

其他的有什么用,我可以在哪些实际应用中使用它们?

【问题讨论】:

【参考方案1】:

readyState 值的完整列表是:

State  Description
0      The request is not initialized
1      The request has been set up
2      The request has been sent
3      The request is in process
4      The request is complete

(来自https://www.w3schools.com/js/js_ajax_http_response.asp)

实际上你几乎从不使用它们中的任何一个,除了 4。

一些 XMLHttpRequest 实现可能会让您在readyState==3 时看到在responseText 中收到的部分响应,但这不是普遍支持的,不应依赖。

【讨论】:

传输中的错误仍会将 readyState 更新为 4。但是,完全中断的传输会将 readyState 重置为 0。因此,由于重定向导致的传输错误并不是真正的“错误” " 并且如果 xhr 的 readyState 为 0,您可以选择忽略记录/报告错误。它有点脆弱,并且您的里程可能会有所不同,具体取决于记录每个事件/错误是“必须拥有”还是“不错有”。如果是后者,您可以承受丢失可能是错误的罕见事件以及 readyState 为 0 的情况。 +1 给@MattBianco 以获取他的建议。我还想补充一点,Mozilla 开发者网络MDN 可以说是最流行和最值得信赖的参考站点之一,可以满足您的所有 javascript/html/CSS 需求。进行 google 搜索时,在查询前加上“mdn”,这样您就可以省去一些麻烦了。 @GregPettit ,我们可以使用 readystate 0 吗,没有互联网连接,或者存在“请求未初始化”的任何原因 我不确定,@vishalsharma——我记得,只要请求没有初始化,readystate 就是 0。之后,任何其他“完成”(通过成功或错误)都会将 readystate 更新为 4。因此,在传输开始后丢失 internet 会将其翻转为 4,而不是回到 0。如果传输时从未有 internet尝试过,它仍应为 0;它只会在握手后移动到 1。 对 readyState 2 的解释是错误的——或者至少完全是误导性的。 Shure 请求已发送,但这些状态实际上表示已收到所有最终响应标头。【参考方案2】:

Original definitive documentation

012 仅跟踪到目前为止您调用了多少必要的方法来发出请求。

3 告诉您服务器的响应已经开始进入。但是当您使用网页中的XMLHttpRequest 对象时,您几乎无法使用该信息(*),因为您没有'无法访问允许您读取部分数据的扩展属性。

readyState 4 是唯一有意义的。

(*: 关于检查 readyState 3 我能想到的唯一可能的用途是它在服务器端发出某种生命形式的信号,因此您可能会增加等待完整响应的时间当你收到它时。)

【讨论】:

【参考方案3】:

kieron 的答案包含 w3schools 参考。没有人依赖, bobince 的回答给出了链接,它实际上告诉了 IE 的原生实现,

所以这里是引用的原始文档以正确理解 readystate 代表什么:

XMLHttpRequest 对象可以处于多种状态。 readyState 属性必须返回当前状态,它必须是以下值之一:

未发送(数值 0) 对象已构建完毕。

已打开(数值 1) open() 方法已成功调用。在此状态期间,可以使用 setRequestHeader() 设置请求标头,并且可以使用 send() 方法发出请求。

HEADERS_RECEIVED(数值 2) 已遵循所有重定向(如果有),并且已收到最终响应的所有 HTTP 标头。该对象的多个响应成员现在可用。

正在加载(数值 3) 正在接收响应实体正文。

完成(数值 4) 数据传输已完成或传输过程中出现问题(例如无限重定向)。

请在此处阅读:W3C Explaination Of ReadyState

【讨论】:

@CharlesWood,对我来说挑战是在这里***降价编辑器不接受参考w3c ..查看因此我从goo.gl放了短网址....我不明白为什么不允许我直接放 w3c url... 嗯,我刚刚在sandbox 中尝试过,它似乎有效。【参考方案4】:

onreadystatechange 存储一个函数(或函数名),每次readyState属性改变时自动调用 readyState 保存 XMLHttpRequest 的状态。从 0 到 4 的变化:

0:请求未初始化

1:建立服务器连接

2:收到请求

3:处理请求

4:请求完成,响应就绪

状态 200:“正常”

404:找不到页面

【讨论】:

【参考方案5】: 0:已创建未发送的客户端。 open() 尚未调用。 1:已调用 OPENED open()。 2 : HEADERS_RECEIVED send() 已被调用,并且标头和状态 可用。 3:加载下载; responseText 包含部分数据。 4 : DONE 操作完成。

(来自 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState)

【讨论】:

以上是关于XMLHttpRequest 中不同的就绪状态是啥意思,我该如何使用它们?的主要内容,如果未能解决你的问题,请参考以下文章

xhr.readyState的就绪状态

XMLHttpRequest简介

uc/osii任务的状态有哪几种,各自的定义是啥

AJAX - onreadystatechange 事件(XMLHttpRequest对象的属性)

java中如何判断发送的请求是不是得到响应

AJAX