在jQuery ajax请求中,我有回调时的错误处理:
success: function(a) {
if (a.error) switch (a.error) {
case "formError":
case "clientError":
case "limitError":
doErrorCorrection();
alert("Client-sided error: " + a.errorMessage);
break;
case "serverError":
case "500Error":
doRollback();
doTransactions();
break;
case "generalError":
alert("One plus one is: " + (1+1));
} else doActionsWith(a)
}
我想把它转移到它自己的对象中,例如:
var errors = {
...
formError: function() {...},
generalError: function() {...},
...
};
有了这个,我可以说:
success: function(a) {
if (a.error) return errors[a.error](a.errorMessage);
doActionsWith(a)
}
问题是我有很多来自switch的回流,如果我要把它转换成一个对象,那就意味着一遍又一遍地重复相同的功能。
var errors = {
formError: function() { methodA() },
clientError: function() { methodA() },
limitError: function() { methodA() },
...
//more if I had more reflows
};
所以我想到了一个数组/列表作为索引。我搞砸了设置索引,如:
var arr = {
test: 'hello world'
};
var index = ['a', 'b', 'c'];
arr[index] = 'array as index';
它有效,但只是部分。当我运行密钥时,它们以字符串形式返回:
for (var key in arr) console.log(key)
//test
//a,b,c
使用对象运行相同的测试,index = {'a' = true}
仅将字符串索引object Object
设置为array as index
。
好的,所以作为索引的数组/对象不起作用,我应该如何将我的开关重组为一个对象?
答案 0 :(得分:1)
当您使用数组作为对象属性名称时,它们会变成等效的字符串,因此[1,2,3]
将被用作"1,2,3"
;它不会像“如果值是这些值中的任何一个”那样工作。
对于您的特定问题,我将创建一个专用的错误处理程序对象,如下所示:
function ErrorHandler(map, handlers)
{
this.map = map;
this.handlers = handlers;
}
ErrorHandler.prototype.handle = function(a) {
var handler = this.handlers[this.map[a.error]];
if (handler) {
handler(a);
}
}
构造函数采用错误映射和处理函数;调用.handle()
时,它会找到处理程序并运行它。这是你实例化它的方式:
var myHandler = new ErrorHandler({
"formError": "clientError",
"clientError": "clientError",
"limitError": "clientError",
"serverError": "serverError",
"500Error": "serverError"
"generalError": "genericError"
}, {
clientError: function(a) {
doErrorCorrection();
alert("Client-sided error: " + a.errorMessage);
},
serverError: function(a) {
doRollback();
doTransactions();
},
genericError: function(a) {
alert("One plus one is: " + (1+1));
}
});
使用它:
success: function(a) {
if (a.error) {
myHandler.handle(a);
} else doActionsWith(a)
}
答案 1 :(得分:1)
您可以维护一系列对象:
var arr = [{
msg: 'Hello World',
val: ['a', 'b', 'c']
}, {
msg: 'This is a dummy text.',
val: ['d', 'e', 'f']
}];
// now perform your search
for (var obj in arr) {
var idx = arr[obj].val.indexOf('a');
if (idx !== -1) { // if val is found
alert(arr[obj].msg); // alerts "Hello World"
}
}