关于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
相关产品推荐
相关产品推荐

