Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Ext.data.Store访问http状态代码_Javascript_Ajax_Extjs_Xmlhttprequest_Extjs4 - Fatal编程技术网

Javascript 从Ext.data.Store访问http状态代码

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实践是什么”。异常事件确实提供了一个响应对象,该对

我有一个http API(惊人的新技术),它可以对不同的错误做出反应,设置不同的响应状态

问题是-在代理内部使用Ext.data.Store和一些XMLHttpRequest时,处理这种状态的最佳方法是什么?据我所知,“加载”事件不会直接传递状态,也不会传递“异常”,最后一个事件甚至在收到4**状态时也不会触发


因此,正如我从代码中看到的,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());
    }
}