在Chrome中超时Ext.Ajax.request之后未捕获的异常

Chr*_*ris 5 extjs extjs4 extjs4.1

我正在使用ExtJS 4.1,当发生超时时,我在谷歌浏览器中收到未被捕获的异常.

Ext.Ajax.timeout = 10000; // 10 seconds
Ext.Ajax.method = "GET";
Ext.Ajax.request({
    url:'rest/dataloggerset.json',
    params:{
           sessionGuid:Ext.getStore("User").getAt(0).get("sessionGuid"),
            loggerId:this.availableLogFiles.loggerId,
            logSet:this.currentLog
    },
    success:this.processReceivedLogData,
    failure:this.failureDuringResourceLoad,
    scope:this
});
Run Code Online (Sandbox Code Playgroud)

请求以超时结束,并且尝试在对象中解析到目前为止接收到的数据.因此,我在开发人员控制台中看到的未被捕获的异常如下所示:

未捕获错误:INVALID_STATE_ERR:DOM异常11 Connection.js:914 Ext.define.createResponse Connection.js:914 Ext.define.onComplete Connection.js:859 Ext.define.abort Connection.js:767 request.timeout

这个问题没有出现在FF中.由于未捕获的异常,我的方法failureDuringResourceLoad未被调用.

值得一提的是,当定义的超时时间过去后,数据仍在传输.

有任何想法吗?

Chr*_*ris 3

经过一些研究,我发现 xhr.abort() 行为在 Chrome 和 FF 中有所不同。在 Chrome 中,xhr.status 保持不变 200,而 FF 中的状态在调用 xhr.abort() 后设置为 0。

这种差异会在 ExtJS 4.1 中产生影响,即超时请求被误认为是有效响应。我使用以下覆盖来处理超时情况。在 ExtJS 4.1 中,请求对象上的变量标记是否发生超时。该重写替换了 onComplete 方法。

Ext.define('Df.data.Connection', {
    override: 'Ext.data.Connection',

    onComplete : function(request) {
        var me = this,
            options = request.options,
            result,
            success,
            response;

        try {
            result = me.parseStatus(request.xhr.status);
        } catch (e) {
            // in some browsers we can't access the status if the readyState is not 4, so the request has failed
            result = {
                success : false,
                isException : false
            };
        }

        success = result.success && !request.timedout;

        if (success) {
            response = me.createResponse(request);
            me.fireEvent('requestcomplete', me, response, options);
            Ext.callback(options.success, options.scope, [response, options]);
        } else {
            if (result.isException || request.aborted || request.timedout) {
            response = me.createException(request);
            } else {
                response = me.createResponse(request);
            }
            me.fireEvent('requestexception', me, response, options);
            Ext.callback(options.failure, options.scope, [response, options]);
        }
        Ext.callback(options.callback, options.scope, [options, success, response]);
        delete me.requests[request.id];
        return response;
    }
});
Run Code Online (Sandbox Code Playgroud)

更改可以在 Connection.js 中原始位置的第 856 行找到。我已经延长了

success = result.success;
Run Code Online (Sandbox Code Playgroud)

到 :

success = result.success && !request.timedout;
Run Code Online (Sandbox Code Playgroud)

如果有更方便的方法来解决这个问题请告诉我!