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

关于jQuery Deferred链式调用的问题:为何返回结果不符预期?

为什么控制台输出'A'而不是'B'?

这个问题的核心在于你对jQuery Deferred中done()方法的理解有偏差——done()只是用来注册回调函数,它并不会修改原Deferred对象的决议结果。

咱们来拆解你的代码逻辑:

  • 你首先创建了一个已经用'A'决议的Deferred对象ajaxCallMock,它的结果值已经固定为'A'了。
  • 当你调用ajaxCallMock.done(function(response) { return 'B'; })时,这个回调函数确实会在Deferred决议时执行,但它的返回值不会对原Deferred的结果产生任何影响——原Deferred依然会把'A'作为它的最终结果传递给后续的回调。
  • 所以当你调用ajax_call().done(...)时,你监听的还是最初那个以'A'决议的Deferred,自然会输出'A'。
怎么改成输出'B'?

如果你想要修改Deferred传递的结果,应该使用then()方法。和done()不同,then()会返回一个全新的Deferred对象,这个新对象的决议值就是你回调函数的返回值。修改后的代码如下:

function ajax_call() { 
  var ajaxCallMock = $.Deferred().resolve('A'); 
  return ajaxCallMock.then(function(response) { 
    return 'B'; 
  }); 
} 
ajax_call().done(function(response) { 
  console.log(response); // 现在会输出'B'啦
});

总结一下两者的关键区别:

  • done():注册回调,返回原Deferred对象,不会改变原结果
  • then():注册回调,返回新Deferred对象,新结果由回调返回值决定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:58:11