javascript - jQuery Deferred/Promise 设计模式和用例

标签 javascript jquery oop design-patterns jquery-deferred

我的问题很笼统,可以在 SO 上找到一些相关问题,但这些都不是我要找的。

我一直在阅读/玩弄 jQuery Deferred object我看到它在库本身内部被大量使用来处理 ajax 请求和动画等。我了解一般功能,并认为它已被证明在某些情况下非常有用。 jQuery 库使用这个概念非常优雅地解决了一些问题。

现在我的问题是:我认为概述不同的问题/解决方案场景会非常有用,这些场景可以使用 Deferred 对象优雅而稳健地解决。

在哪些情况下需要使用 jQuery Deferred 的解决方案? javascript 软件设计中的哪些一般模式可以区分,可以使用 jQuery 延迟功能最优雅地解决?我打算本着每个 OO 分析师都知道的四种设计模式的精神,编制一份非常一般模式的列表(而不是非常具体的示例)。

有了这样一个 list ,在设计 jQuery 解决方案时,利用这些延迟模式应该成为第二天性,就像桥、工厂等模式已经帮助我们设计灵活的和强大的解决方案,而无需每次都重新发明轮子。

最佳答案

异步任务大致分为 5 个不同的问题领域。

网络/本地数据请求

可能是最常见的,Fabrizio Calderan 的回答很好地涵盖了这一点。在这些情况下,我们必须处理至少 2 个结果,并根据粒度(请求的各种类型的成功或错误),然后对它们采取行动。

Deferred/Promises 允许我们链接或并行化请求,或两者的混合,以实现我们任务所需的资源加载。例如,我们可以等待一系列请求完成,然后再加载更多请求,或根据这些结果执行其他操作。

动画

链接/并行动画序列更易于实现和维护。基于不同结果的条件步骤(在考虑用户交互或随机因素时。)也易于实现和维护。

(伪)模态用户交互

真正的模态操作在浏览器中是不可能的,并且呈现对话框、向导等需要 Deferred/Promises 提供的异步操作在清理之前对解决的结果(成功、事件、选项、取消等)起作用显示(也已简化,如前所述)并恢复正常操作。 Deferred/Promises 允许您以相对简单的声明方式对这些结果采取行动。

有效地将用户交互与动画/显示序列结合起来。

硬件可用性/响应

移动设备的可用性(例如通过 PhoneGap)需要在调用它们以获取服务之前得到保证,并且在许多情况下,提供异步响应。使用 Deferred/Promises 可以简化和改进管理这些设备交互的代码。

软件组件事件

具体来说,SQLLite 提供了它对 JS 请求的异步响应,因此进行复杂的查询交互比使用回调要简单得多。

理论上,这适用于提供异步响应的任何辅助软件组件。

还有一件事...

这是我读过的关于 Deferred/Promises 的最好的文章之一,我建议阅读它以获得一些适当的深入示例和解释。

tl;dr

Deferred/Promises 的最大好处是,它们使多个领域的解决方案更容易在一开始就构思出来,然后再进行维护。在某些情况下,他们将它们简化得如此之多,以至于他们尝试使用回调和复杂的结果检查,许多成年人(可能还有一些 child )

...将从这里开始...

We're on a boat, and we're using Deferred/Promises

为此...

callbacks are a nightmare

如果一个解决方案需要链接,等待一个或多个过程的结果来解决,或者这些过程的任意组合,Deferred/Promises 会让您免于沮丧和痛苦,并且对任何继承您代码的人都会这样做。

现在出去用可怕的虐待来证明我错了。不,真的,不要那样做。编写简洁、可维护的代码。

免责声明:在您的代码中使用 Deferred/Promises 可能不会让您感觉“在船上”,但感觉比用回调做成的汤要好得多

关于javascript - jQuery Deferred/Promise 设计模式和用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160785/

相关文章:

javascript - 使用 Javascript 发布表单

javascript - jQuery AJAX 发送两个请求

JavaScript 从函数或对象中捕获异常

java - get 和 set 方法有什么意义

javascript - 我如何在 Controller 之间共享功能?

javascript - 如何停止将 www.html.com 附加到 URLS 开头的 Rails

javascript - 开放层 3 : Drawing a polygon feature over the dateline

javascript - 当窗口未聚焦时如何强制发生 Jquery 动画

javascript - 将具有特定类的所有 Font Awesome 5 图标更改为另一个 FA 图标 - JS/SVG

c# - .NET 中的链接构造函数