首页 > 解决方案 > 如果回调包含错误,为什么 jQuery 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 将抛出异常并且程序退出。在 case 3 和 case 4之后console.log( null );调用,作为. 所以我得到控制台输出,然后是异常。 f2f1oi

我的问题是:为什么要这样实现?我是否错过了有关此过程的重要思想?我希望这两个函数都会被调用,无论一个是否抛出异常,但至少在 jQuery 1.9.1 中,我惊讶地发现情况并非如此。

.done确保传递给(or .fail, or )的每个函数都被实际调用不是更有意义...吗,不管其他函数之一发生了什么?也许这仅仅是由于一个过时的 jQuery 版本?

请注意:我在这里没有做任何链接。这不应该是dfd.done(...).done(...);. 我想要做的是定义两个(或动态数量的)行为,用于解决特定承诺时,然后惊讶地发现一个回调的行为能够阻止调用另一个回调。我的期望是回调被独立处理,以便调用其他回调,即使一个因错误而崩溃。

关于这个问题,我查看了是否已经回答,在StackOverflow上查找了类似的问题,并查看了.done. 我发现并不令人满意,如果这恰好是重复的,那么请提前道歉。

标签: javascriptjqueryjquery-deferreddeferred

解决方案


推荐阅读