jQuery延迟/承诺设计模式和用例

时间:2012-08-28 13:53:06

标签: javascript jquery oop design-patterns jquery-deferred

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

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

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

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

在头脑后面列出这样的列表,在设计jQuery解决方案时,应该成为利用这些延迟模式的第二天性,就像桥梁,工厂......模式已经帮助我们设计灵活一样无需每次都重新发明轮子,都能提供强大的解决方案。

2 个答案:

答案 0 :(得分:6)

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

网络/本地数据请求

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

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

动画

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

(伪)模态用户交互

在浏览器中无法进行真正的模态操作,并且呈现对话框,向导等需要Deferred / Promises提供的异步操作,以便在清理之前对已解决的结果(成功,活动,选项,取消等)采取行动。显示(也简化,如已提到)并恢复正常操作。延迟/承诺允许您以相对简单的声明方式对这些结果采取行动。

实际上,这将用户交互与动画/显示序列相结合。

硬件可用性/响应

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

软件组件活动

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

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

还有一件事......

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

TL;博士

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

......会离开......

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

对此......

callbacks are a nightmare

如果解决方案需要链接,等待一个或多个进程的结果解决,或者这些进程的任何组合,Deferred / Promises将为您节省挫折和痛苦,并且对于继承您的代码的任何人都会这样做。< / p>

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

免责声明:在您的代码中使用延迟/承诺可能不会让您觉得“在船上”,但它会比回调的汤感觉更好

答案 1 :(得分:4)

  

在哪种情况下使用jQuery Deferred调用

的解决方案

我认为这是一个拇指规则,每次你都有

  1. 一个或多个异步任务
  2. 一些相关的回调取决于这些任务的成功/失败
  3. 您可以尝试根据延迟对象和承诺重构代码。可以最多使用延迟对象的最常见场景是

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

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