我遇到的问题是,我想为同一个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声明它)并不是一个好的解决方案。
答案 0 :(得分:1)
首先,您的声明" 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);