2

我正在调用一个函数,它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 请求。在 Ajaxdonesuccess处理程序中,我想触发我的回调函数,但这样做是这样的:

$.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;
};
4

1 回答 1

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,而不会将您的 AJAX 代码与与 UI 相关的代码混淆。

于 2013-06-10T12:59:35.810 回答