我正在使用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
});
请求以超时结束,并且尝试在对象中解析到目前为止接收到的数据。因此,我在开发人员控制台中看到的未被捕获的异常如下所示:
未捕获错误: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未被调用。
值得一提的是,当定义的超时时间过后,数据仍在传输。
任何想法?
答案 0 :(得分:3)
经过一些研究后我发现xhr.abort()行为在Chrome和FF中有所不同。在Chrome中,xhr.status保持不变200,而在调用xhr.abort()后,FF中的状态设置为0。
这种差异会导致ExtJS 4.1中的效果,即timedout请求被误认为是有效响应。我已使用以下覆盖来处理超时方案。在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;
如果有更方便的方法解决此问题,请告诉我们!