我的JS代码正在发出请求并监视“ xhr.onreadystatechange”。有时它将收集以下预期的日志:

timestamp   event   method  readyState  status
1/9/2018 9:08:43.474    xhr_readystatechange    POST    1   0
1/9/2018 9:08:46.432    xhr_readystatechange    POST    2   200
1/9/2018 9:08:46.432    xhr_readystatechange    POST    3   200
1/9/2018 9:08:46.433    xhr_readystatechange    POST    4   200


有时它会收集以下未预期的日志:(在这种情况下,在我的应用超时之前的22秒内,readyState从未更改为2)

timestamp   event   method  readyState  status
1/11/2018 21:36:25.390  xhr_readystatechange    POST    1   0
1/11/2018 21:36:47.249  localSend           failed


我明白那个:


readyState 1表示已调用xhr.open,但尚未调用xhr.send
readyState 2表示已调用xhr.send并接收到响应头


我的问题是:如果readyState更改为1但从未更改为2/3/4,实际上是我的POST请求:


从来没有发送过(没有调用xhr.send)?如果是这样,可能是什么原因造成的? xhr.send是否可以在浏览器JS引擎中删除请求?
或者,发送到服务器但由于任何原因卡在服务器上(因此响应头未准备好)。


请注意,这是在IE 11上。

谢谢,

最佳答案

如果readyState为1,则仅表示方法open被调用。这不能说是否发送了请求。如果调用方法send,则客户端将与服务器建立连接。如果连接失败,将触发事件onerror。因此,尝试查看错误消息,它将说明原因。

回答问题。
如果send为1,可能没有调用readyState,但是如果您想知道是否调用了send方法,则应该查看代码,并在调用send方法时记录消息。另外,如果readyState为1,并且您已经检查了调用方法send,则意味着客户端开始与服务器进行建立,因此可能是数据包在路上,并且可能因某种原因而卡住。

简而言之,readyState无法确定方法send是否被调用。检查方法是查看代码,并确保是否调用了send方法。

关于javascript - XMLHttpRequest onreadystatechange在readyState 1和2之间的长时间延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48217557/

10-13 03:24