【问题标题】:How can I tell XHR is sent to server using readyState?我如何知道 XHR 是使用 readyState 发送到服务器的?
【发布时间】:2012-07-26 22:21:41
【问题描述】:

这个问题与我之前的问题有关: Is READYSTATE_LOADED across browsers?

所以我知道 readyState 跨浏览器不可靠。我目前只是尝试在任何浏览器中进行概念验证。

我在我的插件中并且有这样的代码:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){            

  if (xhr.readyState == 4){
      self._onComplete(id, xhr);                    
  }
  else if (xhr.readyState == 2 ){
    self._onSent( id, xhr );
  }

};

如果我记录回调,则在“完成”之前立即触发“发送”,在我的服务器端脚本响应之后。我是否误解了 readyState 2 是什么?我尝试了 1 踢球,但在服务器响应之前也没有触发。

我查看了 xhr 对象的上传对象,它至少有一个“进度”事件,但我仍然没有看到任何关于进度的信息。事实上,如果最后一个进度是 97%,它不会在文件完成发送到服务器时以 100% 触发。因此,当服务器处理上传时,在 readyState 变为 4 之前,进度会挂在 97%。

这使用户认为上传停止了,甚至认为它实际上一直在上升。

【问题讨论】:

    标签: javascript ajax xmlhttprequest


    【解决方案1】:

    没有状态可以检查以查看何时发送请求。

    readyState 2 表示服务器已经响应,所有header都进来了。这在请求的主体部分进来之前就被触发了。

    最好的办法是在发出send() 命令时触发自己的事件。

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){            
    
      if (xhr.readyState == 4){
          self._onComplete(id, xhr);                    
      }
      else if (xhr.readyState == 2 ){
        // Headers received
      }
    
    };
    
    xhr.send(data)
    self._onSend( id, xhr );
    

    4.6 个状态

    UNSENT (数值 0) 对象已被构造。

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

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

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

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

    http://www.w3.org/TR/XMLHttpRequest/#states

    编辑

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){            
    
      if (xhr.readyState == 4){
          self._onComplete(id, xhr);                    
      }
      else if (xhr.readyState == 2 ){
        // Headers received
      }
      else if (xhr.readyState == 1 ){
        // xhr.open() called
        // You can set headers here amoung other things
        xhr.send(data)
        self._onSend( id, xhr );
      }
    
    };
    
    xhr.open(method, url, async, user, password)
    

    http://www.w3.org/TR/XMLHttpRequest/#the-open-method

    【讨论】:

    • 啊,我在哪里读到它对州的了解要少得多。如果我在 .send 关闭时做某事,那不就是第一个字节关闭而不是 100% 的字节吗?
    • 我想把你的答案标记为那个,但是你能回答我关于 .send 的问题吗?
    • 抱歉,错过了您的评论。如果您按照我在回答中给出的示例进行操作,那么您将在发送第一个字节的同时触发。就 w3 制定的规范而言,无法确定何时发送请求。状态 0 和 1 打开会告诉您事情何时开始。如果你在哪里使用xhr.open(),你会得到一个等于1的xhr.readyState,但这不会发送请求。我将更新我的答案以显示一个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2012-06-22
    相关资源
    最近更新 更多