繁体   English   中英

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

[英]Is it possible for an AJAX request to be read before the response is complete?

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

实现这一点的方法是监听 xhr object 中的 readyState。 当 readyState == 3 时,表示新内容已到,您可以访问它。 该技术被称为彗星。

但是请注意,不同的浏览器在此处的行为不同,IE 将不允许您访问它See Here并且 webkit 浏览器 (Chrome/Safari) 在提供数据之前会缓冲 2KB 的数据。 不过,在考虑到这一点之后,您可以听取更改然后采取行动。

不幸的是,jQuery 目前不支持此功能。 您可以按照Bug #8327中的说明解决此问题,他们基本上会退回到对 readyState 进行轮询以查看它是否发生变化。 他们有计划在未来可能会对此做点什么, Bug #9883 ,但不要屏住呼吸。

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

已经有一些很好的答案,但没有一个是真正 100% 可靠或跨浏览器的。 一种更安全的方法可能是将您的响应分成“页面”。 每个请求都可以指定与LIMITOFFSET等效的内容,并且您不断发出请求,直到得到空响应。 这会在客户端和服务器上产生一些额外的开销,但它会更加健壮。

取自: 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');
};

我不确定这是否可行,但值得一试:

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

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

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

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

当然,许多常见的 web 浏览器还不支持开箱即用的 WebSockets,但是已经有许多polyfills模仿了钝边浏览器中的功能,其中许多依赖于 Comet(XHR 长轮询) 在引擎盖下模仿功能。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM