Javascript 从Ext.data.Store访问http状态代码
我有一个http API(惊人的新技术),它可以对不同的错误做出反应,设置不同的响应状态 问题是-在代理内部使用Ext.data.Store和一些XMLHttpRequest时,处理这种状态的最佳方法是什么?据我所知,“加载”事件不会直接传递状态,也不会传递“异常”,最后一个事件甚至在收到4**状态时也不会触发Javascript 从Ext.data.Store访问http状态代码,javascript,ajax,extjs,xmlhttprequest,extjs4,Javascript,Ajax,Extjs,Xmlhttprequest,Extjs4,我有一个http API(惊人的新技术),它可以对不同的错误做出反应,设置不同的响应状态 问题是-在代理内部使用Ext.data.Store和一些XMLHttpRequest时,处理这种状态的最佳方法是什么?据我所知,“加载”事件不会直接传递状态,也不会传递“异常”,最后一个事件甚至在收到4**状态时也不会触发 因此,正如我从代码中看到的,xhr实例是从Ext.data.store中隐藏的,因此问题也可以表述为“处理低级xhr对象的最佳extjs实践是什么”。异常事件确实提供了一个响应对象,该对
因此,正如我从代码中看到的,xhr实例是从Ext.data.store中隐藏的,因此问题也可以表述为“处理低级xhr对象的最佳extjs实践是什么”。异常事件确实提供了一个
响应
对象,该对象具有一个状态
属性,其中包含您想要查看的HTML状态代码
如果您的异常确实不是由4个**错误触发的(根据我的经验,这的确会触发),那么您可以尝试注册一个ajax侦听器:
Ext.Ajax.on('requestexception',exceptionHandlerMethod);
及
Ext.data.Store上没有异常事件。相反,是Ext.data.proxy.Server及其子类(如Ext.data.proxy.Ajax)定义了一个代理。侦听器接收一个包含http状态的响应对象
根据您的设置,您可以在商店的代理上注册侦听器,或者(如果商店使用模型)在模型的代理上注册侦听器
该测试设置在Chrome 14和FF 6上对我有效:
var store = Ext.create('Ext.data.Store', {
fields: [ 'field1', 'field2'],
proxy: {
type: 'ajax',
url: 'api/data.json',
reader: {
type: 'json',
root: 'data'
},
listeners: {
exception: function(proxy, exception, operation) {
console.log(response.status);
}
}
},
});
store.load();
使用ExtJS5.1
存储/代理可以通过侦听“beginprocessresponse”或“endprocessresponse”事件来访问每个响应http代码和头
proxy: {
// snip
listeners: {
beginprocessresponse: 'onResponse'
}
onResponse: function(store, response, operation) {
console.log('prior to reader');
console.log(response.getAllResponseHeaders());
}
}
我很好奇EventDomain是如何将Ext.Ajax、代理、阅读器和存储混合在一起的 谢谢你的回答。据我所知,Ext.Ajax是一个Ext.data.Connection实例。但是如何访问Ext.data.Store中的特定连接?我想使用Ext.data.Store并以某种方式处理一些依赖于响应的状态。现在,我已经更好地理解了基本思想。非常感谢。否决票-如果你在谈论例外事件-我猜你在谈论瑜伽-你只是没有读过问题。也许你没有读过答案;)事实上,在ext4.0.2a中,代理会触发一个异常事件,当服务器返回4xx http状态代码时也会触发该事件。我更新了我的答案,可能现在对您有更多帮助。以下状态会触发异常-12002、12029、12030、12031、12152、13030-请参见
parseStatus
函数。如果我不正确,请纠正我。我对你投了更高的票,如果你的答案似乎是正确的,我会把它标记为正确的答案。我现在更明白你在处理什么了。然而,5位HTTP状态码并不完全符合RFC2616(这是微软的疯狂,对吧?)。如果您已经查看了Ext.data.Connection#onComplete和#parseStatus,那么您将知道这些特殊的5位代码没有传递到response.status属性(无论出于何种原因!?)。您的问题应该更新为明确提及那些特殊的不符合HTTP状态代码。此外,您应该重新评估您的语句,该语句说:“……以及“异常”,最后一个语句实际上在接收到4**状态时甚至不会触发”,这对于Ext 4.0.2a是不正确的。我还将再次更新我的问题,以概述您的问题的可能解决方案。
proxy: {
// snip
listeners: {
beginprocessresponse: 'onResponse'
}
onResponse: function(store, response, operation) {
console.log('prior to reader');
console.log(response.getAllResponseHeaders());
}
}