我有一个需要一段时间才能完成的ajax请求,但服务器确实会输出一些内容。如果我只是在浏览器中加载请求,我可以看到页面缓慢加载,它可以随时停止。是否可以在服务器关闭响应之前访问不完整的ajax请求?
答案 0 :(得分:6)
实现此目的的方法是通过侦听xhr对象中的readyState。 当readyState == 3时,表示新内容已到达,您可以访问它。该技术被称为Comet。
但请注意,不同的浏览器在此处的行为不同,IE不允许您访问它See Here和webkit浏览器(Chrome / Safari)缓冲2KB的数据,然后才能使其可用。在考虑到这一点之后,你可以听取改变然后采取行动。
不幸的是,jQuery目前不支持这种开箱即用。您可以按照Bug #8327中的说明解决这个问题,它们基本上会回退到readyState上,以查看它是否发生变化。他们计划在将来做一些事情,Bug #9883,但不要屏住呼吸。
所以最后,是的,这是可能的,不是不容易。
答案 1 :(得分:2)
已经有一些好的答案,但它们都不是100%可靠或跨浏览器。更安全的方法可能是将您的响应分成“页面”。每个请求都可以指定等同于LIMIT
和OFFSET
的内容,并且在您获得空响应之前一直发出请求。这会在客户端和服务器上产生一些额外的开销,但它会更强大。
答案 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吗?然后,您可以刷新输出缓冲区并在处理请求时读取内容。
答案 5 :(得分:0)
Comet目前是一个很好的解决方法,但在不久的将来它将被WebSockets取代。
当然,WebSockets目前还不支持许多常见的Web浏览器,但是已经有一些polyfills模仿了枯燥乏味的浏览器中的功能,其中很多都是依靠Comet(XHR长轮询)来模仿功能。
就个人而言,我更喜欢socket.io polyfill,但我对它的体验仅限于与node.js一起使用,这可能与您正在使用的内容很好地融合。