5

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

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

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

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

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

4

2 回答 2

6

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

网络/本地数据请求

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

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

动画

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

(伪)模态用户交互

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

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

硬件可用性/响应

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

软件组件活动

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

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

还有一件事...

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

tl;博士

Deferred/Promises 的最大好处是,它们使多个领域的解决方案更容易首先构思和维护。在某些情况下,他们将它们简化得如此之多,如果他们尝试使用回调和复杂的结果检查,许多成年成年人(可能还有一些小孩)

...会从这个...

我们在船上,我们正在使用 Deferred/Promises

对此...

回调是一场噩梦

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

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

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

于 2013-02-26T19:15:47.223 回答
4

在哪些情况下需要使用 jQuery Deferred 的解决方案

我认为作为一个经验法则,每次你都有

  1. 一个或多个异步任务
  2. 一些相关的回调取决于这些任务的成功/失败

您可以尝试根据延迟对象和承诺重构您的代码。最多可以使用延迟对象的最常见场景涉及

  • Ajax 请求和回调(单个请求、并行或链接请求)
  • 异步加载要在事件中执行的资产和操作load(例如,像这样的图像预加载器:https ://gist.github.com/958683 )
  • 在完成动画或需要大量嵌套作用域的大量顺序动画后执行的回调:只需将方法链接到promise()方法即可轻松实现,animate()以便返回要处理done()回调的承诺(老实说,我无法真正弄清楚动画是如何失败的)

希望这个提示在某种程度上有用。

于 2012-08-28T14:20:29.090 回答