javascript - 如何将回调函数传递到 $.ajax.done 回调中?

标签 javascript jquery ajax callback promise

我正在调用一个函数,该函数对 URL 进行 ajax GET 操作,如下所示:

// 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;
};

最佳答案

通常,保留“promise”接口(interface)比将回调传递到代码中更好。这将使您能够更好地捕获错误情况。

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 相关代码变得困惑。

关于javascript - 如何将回调函数传递到 $.ajax.done 回调中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17024376/

相关文章:

javascript - 将数据从 jQuery.ajax() 传递到 Angular Controller ?

javascript - 隐藏元素 Selenium IDE

javascript - 我可以从 "NIL"的 JavaScript 知识开始使用 jQuery(或 Node.js)吗?

javascript - 试图阻止 Javascript 在页面加载时运行

jquery - SCSS 无法编译 - 动画延迟

javascript - 处理来自不同页面的 ajax URL?

php - 使用 AJAX 检查 PHP session 是否存在或过期

javascript - VBA:从 InternetExplorer 对象访问 LocalStorage

c# - 在 ASP.NET WebForms 中回发后滚动到上一个位置

javascript - 社交共享链接弹出窗口未在共享页面上显示正确的 URL