如何判断XHR是否使用readyState发送到服务器?

时间:2012-07-26 22:21:42

标签: javascript ajax xmlhttprequest

这个问题与我先前的问题有关: 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%。

这使得用户认为上传停滞甚至认为它实际上一直在上升。

1 个答案:

答案 0 :(得分:2)

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

readyState 2表示服务器已响应并且所有标头都已进入。这是在请求的主体部分进入之前触发的。

最好的办法是在发出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