如果回调包含错误,为什么jQuery推迟不确保每个回调都被触发?

时间:2018-08-22 12:01:12

标签: javascript jquery jquery-deferred deferred

我试图正确命名这个问题的尝试可能没有成功,因此,我将描述发生的情况。

当前,我正在编写给我的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();

我收到以下输出:

  1. 例外
  2. 例外
  3. oi,例外
  4. 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的文档。我发现并不令人满意,如果碰巧是重复的事,那么请事先道歉。

0 个答案:

没有答案