【问题标题】:XMLHttpRequest onreadystatechange long delay between readyState 1 and 2XMLHttpRequest onreadystatechange readyState 1 和 2 之间的长时间延迟
【发布时间】:2018-06-21 09:39:09
【问题描述】:

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

谢谢,

【问题讨论】:

  • 在这种情况下最好显示代码而不是日志,但如果它随机发生,则可能是服务器端问题..Maybe related

标签: javascript xmlhttprequest onreadystatechange


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2016-07-31
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多