You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AJAX Promise的.done()前使用回调函数的问题求助

解决jQuery AJAX success回调结果无法传递到done的问题

这个问题我之前也碰到过,核心原因是你对jQuery $.ajax 返回的Deferred对象的工作机制理解有点偏差:success 回调只是一个触发执行的钩子,它的返回值不会改变Deferred最终resolve的数据,所以不管你在success里return什么,.done() 拿到的始终是AJAX请求返回的原始数据。

正确的解决方案:用 .then() 转换Deferred的值

jQuery的Deferred提供了 .then() 方法,它会返回一个新的Deferred对象,并且这个新对象的resolve值就是你在.then()回调里的返回结果。我们可以用它来替代success回调,实现数据的预处理,然后把处理后的数据传递给后续的.done()。

修改后的完整代码如下:

function loadLotsofSomething() {
  var results = [];
  for (var i=0;i<1000;i++) {
    results.push(loadOneSomething(i));
  }
  $.when.apply(this,results).done(function() {
    for (var i = 0; i < arguments.length; i++) {
      // 这里拿到的就是doSomething处理后的结果了!
      console.log(arguments[i]);
    }
  })
}

function loadOneSomething(i) {
  return $.ajax({
    async : true,
    url: url // 这里替换成你的实际请求地址
  }).then(function(data){
    // 在这里用doSomething处理数据,return的结果会传递给后续的done
    return doSomething(data);
  });
}

function doSomething (x) {
  // 这里可以写你的数据处理逻辑,比如修改、过滤x
  return x;
}

为什么这样可行?

  • .then() 是Deferred的链式方法,它接收一个回调函数,当原始AJAX请求成功时,会把原始数据传给这个回调,然后将回调的返回值作为新Deferred的resolve值。
  • 这样loadOneSomething返回的就是一个已经处理过数据的Deferred对象,当$.when等待所有请求完成后,.done()里拿到的自然就是处理后的结果了。

额外提示

如果需要处理请求失败的情况,还可以给.then()传入第二个回调函数(处理reject的情况),比如:

return $.ajax({...})
  .then(function(data){
    return doSomething(data);
  }, function(error){
    // 处理请求失败的逻辑,比如返回默认值或者抛出错误
    console.error('请求失败:', error);
    return null;
  });

内容的提问来源于stack exchange,提问作者Chapo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:30:13