Javascript 将默认函数分配给Ext.Ajax.request失败

Javascript 将默认函数分配给Ext.Ajax.request失败,javascript,ajax,extjs,extjs5,Javascript,Ajax,Extjs,Extjs5,我在应用程序中使用Ext.ajax.request发出大量ajax请求。很多时候,如果请求失败,我不想或没有时间进行任何奇特的错误处理,因此我最终会做这样的事情: Ext.Ajax.request({ url: 'requesturl', success: function (response) { //request successful. do stuff with response }, fai

我在应用程序中使用
Ext.ajax.request
发出大量ajax请求。很多时候,如果请求失败,我不想或没有时间进行任何奇特的错误处理,因此我最终会做这样的事情:

    Ext.Ajax.request({
        url: 'requesturl',
        success: function (response) {
            //request successful. do stuff with response
        },
        failure: function () {
            Ext.Msg.alert('Unknown Error', 'Please alert an administrator.');
        }

我想知道是否有一种方法可以定义默认的Ajax请求失败函数,这样我就不必在我编写的每个Ajax请求中都包含失败参数。

您可以在
Ext.Ajax
上创建自己的自定义方法,该方法具有默认的失败处理程序。在本例中,为了简单起见,我只是模拟了
Ext
对象

//用于演示的实际Ext对象的占位符
var Ext={
阿贾克斯:{
请求:功能(r){
//模拟故障
r、 失败();
}
},
味精:{
警报:功能(标题、消息){
var el=document.createElement('div');
el.innerHTML=标题+'-'+消息;
文件.正文.附件(el);
}
}
}
//向Ext.Ajax添加自定义方法
Ext.Ajax.requestWithDefaultFailure=函数(r){
r、 失败| |(r.failure=函数(){
Ext.Msg.alert('未知错误','请通知管理员');
});
请求(r);
};
//现在使用新方法进行调用
Ext.Ajax.requestWithDefaultFailure({
url:“请求url”,
成功:功能(响应){
//请求成功。使用响应执行操作
}
});
Ext.Ajax.requestWithDefaultFailure({
url:“另一个url”,
成功:功能(响应){
//请求成功。使用响应执行操作
},
失败:函数(){
Ext.Msg.alert('错误','我指定了一个失败处理程序,因此请确保使用该处理程序而不是默认处理程序')
}

});一种侵入性较小的方法是安装全局处理程序。它会有Drew提到的问题,每个电话都会受到影响。因此,如果您真的希望所有Ext.Ajax.request调用都具有这种行为,那么更改现有代码会更简单

使用
MVC
时,您可以创建一个来完成此任务,或者创建自己的ajax类,并从
Ext.ajax
扩展。从那里,您可以实现一些适当的错误处理和/或日志记录

在ExtJS4中

Ext.define('Ext.overrides.Ajax', {
    override : 'Ext.data.Connection',
    listeners : {
        requestexception : function(response) {
            var error = response.status + ' - ' + response.statusText;
            // if response status is 202 (Accepted), should
            // have warning message
            if (response.status == 202) {
                Ext.Msg.show({
                    title : 'REST Warning message',
                    msg : 'Ajax Request Exception! ' + error,
                    cls : 'msg-wrap',
                    buttons : Ext.Msg.OK,
                    icon : Ext.Msg.WARNING
                });
            }

            if (response.status > 400) {
                var errorData = Ext.JSON.decode(response.responseText);

                Ext.Msg.show({
                    title : 'REST Error message',
                    msg : 'Ajax Request Exception! ' + errorData,
                    cls : 'msg-wrap',
                    buttons : Ext.Msg.OK,
                    icon : Ext.Msg.ERROR
                });
            }
        }
    }
});
在ExtJS5中

Ext.define('Ext.override.AjaxOverride', {
    override: 'Ext.Ajax'
    // omitted overridden properties...

}, function() {
    var me = this;

    me.setExtraParams({
        foo: "bar" 
    });

    me.setUrl('MyUrl');
    me.setTimeout(600000);

    me.on({
        scope: me,
        requestexception : function(response) {
            var error = response.status + ' - ' + response.statusText;
            // if response status is 202 (Accepted), should
            // have warning message
            if (response.status == 202) {
                Ext.Msg.show({
                    title : 'REST Warning message',
                    msg : 'Ajax Request Exception! ' + error,
                    cls : 'msg-wrap',
                    buttons : Ext.Msg.OK,
                    icon : Ext.Msg.WARNING
                });
            }

            if (response.status > 400) {
                var errorData = Ext.JSON.decode(response.responseText);

                Ext.Msg.show({
                    title : 'REST Error message',
                    msg : 'Ajax Request Exception! ' + errorData,
                    cls : 'msg-wrap',
                    buttons : Ext.Msg.OK,
                    icon : Ext.Msg.ERROR
                });
            }
        }
    });
});
或者使用类似的东西从
Ext.ajax
扩展(甚至更好)

Ext.define('APP.ux.Ajax', {
    extend: 'Ext.data.Connection',

    requires: [
        'APP.ux.Msg'
    ],

    singleton : true,
    autoAbort : false,

    request: function(config) {
        var cfg = config;

        Ext.apply(cfg, {
            success: function(form, action) {
                APP.ux.Msg.alert('Success', action.result.msg);
                //TODO: Add more logic here
            },
            failure: function(form, action) {
                switch (action.failureType) {
                    case Ext.form.action.Action.CLIENT_INVALID:
                        APP.ux.Msg.alert('Failure', 'Form fields may not be submitted with invalid values');
                        break;
                    case Ext.form.action.Action.CONNECT_FAILURE:
                        APP.ux.Msg.alert('Failure', 'Ajax communication failed');
                        break;
                    case Ext.form.action.Action.SERVER_INVALID:
                        APP.ux.Msg.alert('Failure', action.result.msg);
                        break;
                }
            }
        });
        this.callParent(cfg);
    }
});

条条大路通罗马。但我认为最优雅的方式是使用“Ext.app.EventDomain”

//将Ext.Ajax eNet连接到总线
Ext.define('MyApp.domain.Ajax'{
扩展:“Ext.app.EventDomain”,
辛格尔顿:没错,
键入:“extAjax”,
idProperty:“我的请求”,
构造函数:函数(){
var me=这个;
me.callParent();
me.monitor(Ext.Ajax);
}
});
Ext.define('Myapp.controller.Workspace'{
扩展:“Ext.app.Controller”,
init:function(){
var me=这个;
//使用此控制器处理Ext.ajax中的事件
我,听着({
extAjax:{
'*': {
requestexception:函数(连接、响应、选项){
console.log('exception',response.status,response);
如果(response.status==403){
//打开一个窗口要求登录
popLoginWin();
}
}
}
}
});
}

});您使用的是哪个版本?你在用MVC吗?MVVM?这是一种廉价的解决方案,不太方便用户。您应该编写上下文相关的错误消息为什么不重写?还是扩展ajax类?你会把这些代码放在哪里?@Tarabass如果你说的覆盖是指替换默认的
Ajax.request
方法,那对我来说似乎是个坏主意,因为如果其他地方需要,默认功能就会丢失。至于代码应该放在哪里,这将完全取决于OP项目的结构。我想它可以放在一个模块中,靠近ext.js文件本身被引用的地方。只有在没有提供故障处理程序的情况下,你才应该安装故障处理程序。@JuanMendes说得好,我更新了答案以检查现有的处理程序。@DrewGaynor每个人都在覆盖和扩展他们的屁股,因为这就是使用MVC的ExtJs类系统的强大功能。它甚至被推荐。问题是在每个ajax请求上放置一个地方的失败,即使这样,您也可以像Juan提到的那样设置失败。
Ext.define('APP.ux.Ajax', {
    extend: 'Ext.data.Connection',

    requires: [
        'APP.ux.Msg'
    ],

    singleton : true,
    autoAbort : false,

    request: function(config) {
        var cfg = config;

        Ext.apply(cfg, {
            success: function(form, action) {
                APP.ux.Msg.alert('Success', action.result.msg);
                //TODO: Add more logic here
            },
            failure: function(form, action) {
                switch (action.failureType) {
                    case Ext.form.action.Action.CLIENT_INVALID:
                        APP.ux.Msg.alert('Failure', 'Form fields may not be submitted with invalid values');
                        break;
                    case Ext.form.action.Action.CONNECT_FAILURE:
                        APP.ux.Msg.alert('Failure', 'Ajax communication failed');
                        break;
                    case Ext.form.action.Action.SERVER_INVALID:
                        APP.ux.Msg.alert('Failure', action.result.msg);
                        break;
                }
            }
        });
        this.callParent(cfg);
    }
});