XMLHttpRequest onreadystatechange readyState 1和2之间的长延迟

时间:2018-01-11 23:45:42

标签: javascript xmlhttprequest onreadystatechange

我的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

其他时候它会收集以下日志,这些日志是不期望的:(在这种情况下,readyState在我的应用程序超时之前的22秒内从未更改为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尚未调用)?如果是这样,可能是什么导致了这个?请求可以在浏览器JS引擎中被xhr.send删除吗?
  • 或者,发送到服务器但由于某种原因而卡在那里(因此响应头没有准备好)。

请注意,这是在IE 11上。

谢谢,

1 个答案:

答案 0 :(得分:1)

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

回答这个问题。 如果send为1,则可能未调用readyState,但如果您想知道调用或不调用方法send,则应该看到代码,并在何时记录消息调用方法send。此外,如果readyState为1,并且您已经检查了方法send被调用,则意味着客户端开始与服务器建立,因此可能是数据包正在运行,并且它可能因某种原因而陷入困境。

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