1

我有一个生成 XML 响应的请求。由于某些当前的限制,响应可能会非常缓慢地完成,但确实开始快速返回数据。

是否可以在响应完成之前读取 Ext JS 中的响应流?我的理解是,*Readers只有在完成后才会给出响应文本。

4

1 回答 1

0

似乎没有用于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);

    }
});
于 2012-04-05T10:00:23.787 回答