我试图正确命名这个问题的尝试可能没有成功,因此,我将描述发生的情况。
当前,我正在编写给我的Web应用程序的扩展。该Web应用程序使用jQuery 1.9.1。我观察到以下行为:
/** define callback functions */
var f1 = function () { console.log( null ); };
var f2 = function () { console.log( "oi" ); };
/** create deferred objects */
var dfd1 = $.Deferred();
var dfd2 = $.Deferred();
var dfd3 = $.Deferred();
var dfd4 = $.Deferred();
/** set behavior for .done */
dfd1.done( f1 );
dfd1.done( f2 );
dfd2.done( f1, f2 );
dfd3.done( f2 );
dfd3.done( f1 );
dfd4.done( f2, f1 );
现在,根据要测试的行为,取消注释任一行,但始终仅注释其中一行,由于抛出异常,将不再处理另一行:
// dfd1.resolve();
// dfd2.resolve();
// dfd3.resolve();
// dfd4.resolve();
我收到以下输出:
oi
,例外oi
,例外现在。我确实了解那里发生了什么,但不了解实现背后的基本思想。 console.log( null );
行是引发异常的简单方法。因此,情况1和情况2将引发异常,并且过程退出。在情况3和情况4中,console.log( null );
在f2
中被称为之后 f1
。因此,我得到了控制台输出oi
,后跟异常。
我的问题是:为什么以这种方式实施?我是否缺少有关此过程的重要想法?我希望两个函数都能被调用,无论是否抛出异常,但是至少在jQuery 1.9.1中,我惊讶地发现事实并非如此。
确保传递给.done
(或.fail
或...
)的每个函数实际上都被调用更有意义,而不管其中一个发生了什么其他功能?也许这仅仅是由于过时的jQuery版本造成的?
请注意:我在这里没有进行任何形式的链接。这不应该是dfd.done(...).done(...);
的任何一种实现。我想做的是为特定的承诺得到解决时定义两种(或动态数量)的行为,然后惊讶地发现一个回调的行为能够阻止调用另一个回调。我的期望是,回调是独立处理的,因此即使其中一个因错误而崩溃,也可以调用其他回调。
关于这个问题,我查看了是否已经回答,在 StackOverflow 上寻找了类似的问题,并浏览了.done
的文档。我发现并不令人满意,如果碰巧是重复的事,那么请事先道歉。