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

Asc*_*iom 5 javascript oop jquery design-patterns jquery-deferred

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

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

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

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

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

oco*_*odo 6

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

网络/本地数据请求

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

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

动画

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

(伪)模态用户交互

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

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

硬件可用性/响应

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

软件组件活动

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

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

还有一件事...

这是我读过的关于延迟/承诺的最好的文章之一,我建议阅读它以获得一些适当深入的例子和解释.

TL;博士

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

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

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

对此......

回调是一场噩梦

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

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

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


fca*_*ran 4

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

我认为作为一条经验法则,每次你同时拥有两者时

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

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

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

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