在 Chrome 中超时 Ext.Ajax.request 后未捕获的异常
Posted
技术标签:
【中文标题】在 Chrome 中超时 Ext.Ajax.request 后未捕获的异常【英文标题】:Uncaught Exception after Timeout Ext.Ajax.request in Chrome 【发布时间】:2012-11-20 10:38:50 【问题描述】:我正在使用 ExtJS 4.1,当发生超时时,我在 Google Chrome 中遇到了未捕获的异常。
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
);
请求以超时结束,并且尝试在对象中解析到目前为止接收到的数据。因此,我在开发人员控制台中看到的未捕获异常如下所示:
未捕获的错误: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 请求超时
这个问题在 FF 中没有出现。由于未捕获的异常,我的方法 failureDuringResourceLoad 没有被调用。
值得一提的是,当定义的超时时间过去时,数据仍在传输。
有什么想法吗?
【问题讨论】:
你是在 localhost/ 上运行还是从 file:// 运行? localhost/ 分别为server.com 好的。 Have you checked other SO entries? 通信本身封装在 ExtJS 库中。所以我总是尽量避免更改库代码。 此问题在 senchas 错误论坛中作为错误提交:sencha.com/forum/… 【参考方案1】:经过一些研究,我发现 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;
);
可以在 Connection.js 的原始位置的第 856 行找到更改。我已经扩展了
success = result.success;
到:
success = result.success && !request.timedout;
如果有更方便的方法解决这个问题,请告诉我!
【讨论】:
+1 你应该把这个发到ExtJS bug forum以上是关于在 Chrome 中超时 Ext.Ajax.request 后未捕获的异常的主要内容,如果未能解决你的问题,请参考以下文章