我有一个问题,我希望同一个AJAX请求具有不同的回调路由,因为有时需要使用相同的功能(即获取有关产品ID或类似信息的信息)。
起作用的是这样的:
function1() {
$.ajax({
url: "test.html",
context: document.body
}).done(function() {
route1function();
});
}
function2() {
$.ajax({
url: "test.html", // do the same crap here...
context: document.body
}).done(function() {
route2function();
});
}
function3() {
$.ajax({
url: "test.html", // and here again *yawn*
context: document.body
}).done(function() {
route3function();
});
}
复制和粘贴编码是邪恶的,所以我的想法是执行以下操作:
doMyAmazingStuff(iRoute) {
$.ajax({
url: "test.html",
context: document.body
}).done(function() {
switch(iRoute) {
case 1:
route1function(data);
break;
case 2:
route2function(data);
break;
// and so on...
}
});
}
不幸的是,iRoute不会传递给.done函数,并且是未定义的。还有其他选择如何在这些变量中生存?复制/粘贴/粘贴/粘贴...就像第一个示例一样,是没有选择的(样式也很差)。我认为,将它们设置为全局范围(设置阴影变量而不用var声明)并不是一个很好的解决方案。
最佳答案
首先,您的语句“ iRoute不会传递给.done函数且未定义”是不正确的。如果将iRoute
传递给函数,则不会被不确定。请参见this demonstration。我将1
作为函数的参数传递,并且done
函数内的警报正在警报该数字。
编写该代码的方法可能比较整齐,但是它几乎是相同的代码-只是意味着使用AJAX Promise接口从单独的函数返回数据。
function getData() {
return $.ajax({
url: "test.html",
context: document.body
});
}
function doMyAmazingStuff(iRoute) {
getData.done(function (data) {
switch(iRoute) {
case 1:
route1function(data);
break;
case 2:
route2function(data);
break;
}
});
}
doMyAmazingStuff(1);