如何将回调函数传递给$ .ajax.done回调?

时间:2013-06-10 12:54:50

标签: javascript jquery ajax callback promise

我正在调用一个函数,它会将ajax GET设为一个url,如下所示:

// parameters = url, callback, boolean
that.mapUrl( window.location.search, function(spec) {
    console.log("initial mapping done");
    console.log(spec);
    // do stuff
  }, true);

mapUrl将触发Ajax请求。在Ajax donesuccess处理程序中,我想触发我的回调函数,但是这样做:

$.ajax({
  method: 'GET',
  url: obj[1],
    context: $('body')
  }).fail(function (jqXHR, textStatus, errorThrown) {
    console.log("FAILED");
    configuration = {
      "errorThrown":errorThrown,
      "textStatus": textStatus,
      "jqXHR": jqXHR
    }    
  }).done(function(value, textStatus, jqXHR) {
    console.log("OK");
    console.log(callback) // undefined!
    configuration = {
      "value":value,
      "textStatus": textStatus,
      "jqXHR": jqXHR
    }
  });

问题
所以我想知道如何将我的回调函数传递到ajax done-callback。知道怎么做吗?

谢谢!

修改
这是完整的mapURL函数

that.mapUrl = function (spec, callback, internal) {
  var key,
    obj,
    parsedJSON,
    configuration = {"root" : window.location.href};

  if (spec !== undefined && spec !== "") {
    obj = spec.slice(1).split("=");
    key = obj[0];
    console.log(key);
    switch (key) {
    case "file":
      $.ajax({
        method: 'GET',
        url: obj[1],
        context: $('body')
      }).fail(function (jqXHR, textStatus, errorThrown) {
        console.log("FAILED");
        configuration = {
          "errorThrown":errorThrown,
          "textStatus": textStatus,
          "jqXHR": jqXHR
        }
      }).done(function(value, textStatus, jqXHR) {
        console.log("OK");
        configuration = {
          "value":value,
          "textStatus": textStatus,
          "jqXHR": jqXHR
        }
      });
      break;
    default:
      // type not allowed, ignore
      configuration.src = [];
      break;
    }
  }
  return configuration;
};

1 个答案:

答案 0 :(得分:3)

通常最好保留“promise”接口,而不是将回调传递给代码。这样可以更好地捕获错误条件。

function mapUrl(url) {
    return $.ajax(...)
            .fail(...)
            .then(function(data) {
                // preprocess data and return it
            });
}

在使用.then的情况下,您可以在将返回的数据传递给回调之前对其进行操作:

mapUrl(...).done(function(data) {
    // data has been preprocessed
    ...
});

如果AJAX调用失败,您此时也可以链接其他.fail处理程序,这是您当前API不允许的。这种“关注点分离”可以让您更好地处理错误处理UI,例如,不会使用与UI相关的代码混淆您的AJAX代码。