javascript - 如果回调包含错误,为什么 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();
我收到以下输出:
- 例外
- 例外
oi
, 例外oi
, 例外
现在。我确实了解那里发生的事情,但不了解实施背后的基本思想。该行console.log( null );
是引发异常的简单方法。因此情况 1 和情况 2 将抛出异常并且程序退出。在 case 3 和 case 4之后console.log( null );
调用,作为. 所以我得到控制台输出,然后是异常。 f2
f1
oi
我的问题是:为什么要这样实现?我是否错过了有关此过程的重要思想?我希望这两个函数都会被调用,无论一个是否抛出异常,但至少在 jQuery 1.9.1 中,我惊讶地发现情况并非如此。
.done
确保传递给(or .fail
, or )的每个函数都被实际调用不是更有意义...
吗,不管其他函数之一发生了什么?也许这仅仅是由于一个过时的 jQuery 版本?
请注意:我在这里没有做任何链接。这不应该是dfd.done(...).done(...);
. 我想要做的是定义两个(或动态数量的)行为,用于解决特定承诺时,然后惊讶地发现一个回调的行为能够阻止调用另一个回调。我的期望是回调被独立处理,以便调用其他回调,即使一个因错误而崩溃。
关于这个问题,我查看了是否已经回答,在StackOverflow上查找了类似的问题,并查看了.done
. 我发现并不令人满意,如果这恰好是重复的,那么请提前道歉。
解决方案
推荐阅读
- java - Spring Boot 拦截器 - 如何排除某些 URL
- node.js - 在 Ubuntu 18.04 中使用 MongoDB 映像和 Nginx 运行 Dockerhub 映像
- c - 通过地址调用强制更改数组的地址(数组名称指向的位置)。错误存在,但它似乎工作虽然..?
- c# - Windows 窗体中的 C# WPF SendKey
- python-3.x - 如何在地图上使用 vaex 可视化大数据级别的经纬度数据
- mongodb - $match 字段从一个集合到 $lookup 中另一个集合的字段
- reactjs - 如何使数据获取与 Redux Toolkit 和 React Hooks 一起工作?
- javascript - Firebase 云功能 + iOS 应用程序:从可调用的云功能向客户端应用程序返回 true/false
- pytorch - 张量大小与分类器的输出特征数不匹配
- docker - 如何在 docker v2 中指示 azureSubscriptionEndpoint