【发布时间】:2018-01-19 22:15:49
【问题描述】:
我设置了通常的 XMLHttpRequest,到目前为止一切正常,我可以检索数据和 readyState 更改并执行各种操作。
但没有发生的一件事是,readyState 在达到 0 时会触发 onreadystatechange() 函数。
现在我想知道...为什么?
我查看了XMLHttpRequest MDN entry,但没有提到为什么当 readyState 达到 0 时不应触发 onreadystatechange。我也没有找到关于该主题的其他信息...
片段:
// Inside a class, this = class instance
this.socket = new XMLHttpRequest();
// For easy access of this class instance in onreadystatechange
var client = this;
// Write current readyState to console
this.socket.onreadystatechange = function ()
{
// Adding this just to verify there are no errors in if block
console.log("readyState: "+client.socket.readyState);
if(client.socket.readyState === 0)
{
console.log("readyState is 0");
}
else
{
console.log("readyState is "+client.socket.readyState);
}
}
当 XMLHttpRequest 套接字处理完请求后,XMLHttpRequest 实例将具有值 readyState===0,至少 Firefox 的 JS 控制台告诉我。
发出请求后,JS 控制台正确列出了 readyStates 1-4 的日志消息,但没有列出 readyState 0 的消息,不是在请求之前,也不是在请求之后。
理论上,当readyState从4变回0时,不应该触发onreadystatechange()函数吗?在 macOS 上使用当前 FF 和 Safari 以及在 Win 上使用 IE11 进行了检查,到处都是相同的行为,onreadystatechange() 永远不会为 readyState 0 触发。
XMLHttpRequest 是故意不这样做,还是我做错了什么?感谢任何有用的输入。 :)
(请不要“使用 jQuery”cmets 或类似的东西,谢谢。)
更新:
在成功或失败的请求完成后,readyState 永远保持在 4,并在 FF、IE、Safari 中验证。
但是,如果正在进行的请求被中止,readyState 将从 > 0 返回到 0。所以 readystatechange 确实发生了,但是 onreadystatechange 没有被触发,在 FF 和 Safari 中验证了这一点。
更新 3:
根据XMLHttpRequest spec,当XHR 处于readyState 3(接收)并中止时,XHR 应通过onreadystatechange 事件将readyState 设置为4(完成),发出网络错误,然后将readyState 设置为0(未发送) 没有 onreadystatechange 事件。
但是当我中止处于 readyState 3(接收)的 XHR 时,它会首先使用 onreadystatechange 事件和 HTTP 状态 200(OK)将 readyState 设置为 4(完成),然后它会触发 onabort 和 onloadend 并重置 readyState为 0(未发送)...但绝不会触发 onerror 事件。
非常混乱。
【问题讨论】:
-
@Lukasas:
===是有效的 JavaScript。这是非强制等于运算符。 -
是的,我的错,当我看到那个运算符时,我正在严格地考虑 php。 readyState 不应为 0,因为这意味着它未设置。所以当socket准备好时,说明它已经打开了,所以应该设置为非零状态
-
但是当我 .open() 套接字和 .send() 请求时,一旦 .readyState 达到 4 并且 .status === 200(表示一切顺利),套接字就会回到 .readyState 0. Firefox 的 JS 控制台在完成请求并返回“idling”后非常清楚地将其显示为它的 .readyState 值。 readyState 从 4 变为 0,但没有触发 onreadystatechange。
-
@Rob: "...套接字回到 .readyState 0。" 不适用于我,不适用于 Firefox,不适用于 Chrome。正如我在回答中所说,我怀疑观察错误。如果你没有找到它,你可能会发布一个 minimal reproducible example 来展示你是如何看待它的,但是对于 Firefox 将
readyState从 4 更改回 0 来说没有意义,它不适合我,我怀疑它不会,期间。 :-)
标签: javascript ajax xmlhttprequest readystate onreadystatechange