异步任务大致可以分为5个不同的问题领域。
网络/本地数据请求
这可能是最常见的领域,也是Fabrizio Calderan的回答所涵盖的。在这些情况下,我们必须处理至少两个结果,并根据细粒度(请求的各种成功或错误类型)采取行动。
Deferred/Promises 可以让我们链接或并行请求,或者二者混合以实现我们任务所需的资源加载。例如,我们可以等待一系列请求完成后,再加载更多内容,或者根据这些结果执行其他操作。
动画
链式/并行动画序列更易于实现和维护。基于不同结果的条件步骤(当考虑用户交互或随机因素时)也很容易实现和维护。
(伪)模态用户交互
在浏览器中无法进行真正的模态操作,而呈现对话框、向导等需要异步操作提供的 Deferred/Promises 来在清理显示(如上所述)并恢复正常操作之前对已解决的结果(成功、活动、选项、取消等)进行操作。Deferred/Promises 允许您以相对简单的声明方式对这些结果进行操作。
实际上,这将用户交互与动画/显示序列结合起来。
硬件可用性/响应
在调用移动设备(例如通过 PhoneGap)提供的服务之前,需要确保其可用性,并且在许多情况下,以异步方式提供响应。使用 Deferred/Promises 简化和改进了管理这些设备交互的代码。
软件组件活动
SQLLite 特别提供其响应用于 JS 异步请求,因此进行复杂的查询交互比使用回调要简单得多。
理论上,这适用于任何提供异步响应的辅助软件组件。
还有一件事...
这是我阅读过的关于 Deferred/Promises 的最好文章之一,我建议阅读它以获取一些具有深度的示例和解释。
总而言之
Deferred/Promises 的巨大优势在于它们使得在第一时间内构思并维护几个领域的解决方案变得更加容易。在某些情况下,它们简化了这些解决方案,以致如果试图使用回调和复杂的结果检查来尝试实现它们,则会让很多成年人(可能还有一些小孩子)感到困扰。
...将从这里开始...
![我们乘船而行,并使用 Deferred/Promises](https://istack.dev59.com/wtxvf.webp)
...到达这里。
如果解决方案需要链接多个进程的结果,等待一个或多个进程的结果解析,或者任何这些的组合,Deferred/Promises将为您节省沮丧和痛苦,并为继承您代码的任何人做同样的事情。
现在,通过犯下可怕的滥用来证明我是错的。不要这样做。编写漂亮干净、易于维护的代码。
免责声明:在您的代码中使用Deferred/Promises可能不会让您感觉像“坐在船上”,但它比回调函数做的更好。