我有一个问题,我希望同一个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);

09-25 13:55