异步任务大致分为 5 个不同的问题域。
网络/本地数据请求
可能是最常见的,并且被 Fabrizio Calderan 的回答很好地涵盖了。在这些情况下,我们必须处理至少 2 个结果,并根据粒度(请求的各种成功或错误类型),然后对它们采取行动。
Deferred/Promises 允许我们链接或并行化请求,或两者的混合,以实现我们任务所需的资源加载。例如,我们可以等待一系列请求完成,然后再加载更多请求,或者根据这些结果执行其他操作。
动画
链接/并行动画序列,更易于实现和维护。基于不同结果的条件步骤(考虑用户交互或随机因素时)也很容易实现和维护。
(伪)模态用户交互
真正的模态操作在浏览器中是不可能的,并且呈现对话框、向导等需要 Deferred/Promises 提供的异步操作来处理已解决的结果(成功、活动、选项、取消等),然后再清理显示(也简化,如前所述)并恢复正常运行。Deferred/Promises 允许您以相对简单的声明方式对这些结果采取行动。
这有效地将用户交互与动画/显示序列相结合。
硬件可用性/响应
移动设备的可用性(例如通过 PhoneGap)需要在调用它们以获取服务之前得到保证,并且在许多情况下,需要异步提供响应。使用 Deferred /Promises 可以简化和改进管理这些设备交互的代码。
软件组件活动
具体来说,SQLLite 以异步方式提供对 JS 请求的响应,因此进行复杂的查询交互比使用回调要简单得多。
理论上,这适用于任何提供异步响应的辅助软件组件。
还有一件事...
这是我读过的关于 Deferred/Promises 的最好的文章之一,我建议阅读它以获得一些适当的深入示例和解释。
tl;博士
Deferred/Promises 的最大好处是,它们使多个领域的解决方案更容易首先构思和维护。在某些情况下,他们将它们简化得如此之多,如果他们尝试使用回调和复杂的结果检查,许多成年成年人(可能还有一些小孩)
...会从这个...
对此...
如果一个解决方案需要链接,等待一个或多个进程的结果来解决,或者这些的任何组合,Deferred/Promises 将帮助您避免沮丧和痛苦,并且对于继承您的代码的任何人都会这样做。
现在出去,通过可怕的虐待来证明我错了。不,真的,不要那样做。编写干净、可维护的代码。
免责声明:在您的代码中使用 Deferred/Promises 可能不会让人觉得您是“在船上”,但它会比由回调组成的汤要好得多