带分叉回调的AJAX请求

时间:2015-03-26 11:16:26

标签: javascript jquery ajax

我遇到的问题是,我想为同一个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声明它)并不是一个好的解决方案。

1 个答案:

答案 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);