是否可以在响应完成之前读取AJAX请求?

时间:2011-07-13 17:11:56

标签: javascript jquery html ajax json

我有一个需要一段时间才能完成的ajax请求,但服务器确实会输出一些内容。如果我只是在浏览器中加载请求,我可以看到页面缓慢加载,它可以随时停止。是否可以在服务器关闭响应之前访问不完整的ajax请求?

6 个答案:

答案 0 :(得分:6)

实现此目的的方法是通过侦听xhr对象中的readyState。 当readyState == 3时,表示新内容已到达,您可以访问它。该技术被称为Comet。

但请注意,不同的浏览器在此处的行为不同,IE不允许您访问它See Here和webkit浏览器(Chrome / Safari)缓冲2KB的数据,然后才能使其可用。在考虑到这一点之后,你可以听取改变然后采取行动。

不幸的是,jQuery目前不支持这种开箱即用。您可以按照Bug #8327中的说明解决这个问题,它们基本上会回退到readyState上,以查看它是否发生变化。他们计划在将来做一些事情,Bug #9883,但不要屏住呼吸。

所以最后,是的,这是可能的,不是不容易。

答案 1 :(得分:2)

已经有一些好的答案,但它们都不是100%可靠或跨浏览器。更安全的方法可能是将您的响应分成“页面”。每个请求都可以指定等同于LIMITOFFSET的内容,并且在您获得空响应之前一直发出请求。这会在客户端和服务器上产生一些额外的开销,但它会更强大。

答案 2 :(得分:1)

取自:https://stackoverflow.com/questions/287286/jquery-is-req-readystate- 3-possible

将ajax调用分配给变量并将事件附加到其readystatechanged

var xhr = $.ajax(...);

xhr._onreadystatechange = xhr.onreadystatechange;

xhr.onreadystatechange = function() {
    xhr._onreadystatechange();
    if (xhr.readyState == 3) alert('Interactive');
};

答案 3 :(得分:0)

我不确定这是否有效,但值得一试:

$.ajax({
  statusCode: {
    206: function() { // 206 is partial content
      // do work
    }
  }
});

答案 4 :(得分:0)

你可以使用长轮询(彗星)代替ajax吗?然后,您可以刷新输出缓冲区并在处理请求时读取内容。

http://www.zeitoun.net/articles/comet_and_php/start

答案 5 :(得分:0)

Comet目前是一个很好的解决方法,但在不久的将来它将被WebSockets取代。

当然,WebSockets目前还不支持许多常见的Web浏览器,但是已经有一些polyfills模仿了枯燥乏味的浏览器中的功能,其中很多都是依靠Comet(XHR长轮询)来模仿功能。


就个人而言,我更喜欢socket.io polyfill,但我对它的体验仅限于与node.js一起使用,这可能与您正在使用的内容很好地融合。