我有一个生成 XML 响应的请求。由于某些当前的限制,响应可能会非常缓慢地完成,但确实开始快速返回数据。
是否可以在响应完成之前读取 Ext JS 中的响应流?我的理解是,*Readers
只有在完成后才会给出响应文本。
我有一个生成 XML 响应的请求。由于某些当前的限制,响应可能会非常缓慢地完成,但确实开始快速返回数据。
是否可以在响应完成之前读取 Ext JS 中的响应流?我的理解是,*Readers
只有在完成后才会给出响应文本。
似乎没有用于Comet 技术的 Ext.Proxy,而且我认为写起来会很困难。首先,您需要编写一个 Sax 解析器来理解不完整的 XML 文档。然后,您需要编写一个代理,在新数据通过时重复执行操作。ExtJS 并不是真正为此而设计的,但尝试一下会是一件有趣的事情。不过,我不确定它有多实用。任何实现的 Ext.Proxy 的行为都会与其他代理大不相同;虽然它可能有同名的方法,但它会是一个非常不同的接口。您必须扩展 Ext.Model 和 Ext.Store 以了解如何使用流数据填充自己,为块事件编写新的侦听器,并为 Stores 和 Models 的消费者编写新的数据协定。我不确定这是否值得你花时间!
但是,如果您只需要在流块通过时抛出一个事件,那么这在 Gecko 和 WebKit 浏览器中是可能的。您只需要将处理程序附加到 XHR 的 onreadystate 事件,每次接收到数据时都会触发该事件。
实验上:
Ext.define('Ext.proxy.StreamEventedAjax',{
extend: 'Ext.proxy.Ajax',
doRequest: function(operation, callback, scope) {
if (Ext.isIE) return null;
// do other doRequest setup here, use this.buildRequest, etc
var me = this,
req = new XMLHttpRequest(),
responseLength = 0,
newText = "";
req.onreadystate = function(e) {
newText = req.responseText.substring(responseLength);
responseLength = req.responseText.length;
operation.fireEvent('datareceived',e,newText);
}
req.open(me.getMethod(request),request.url);
}
});