我的问题非常笼统,一些相关的问题可以在SO上找到,但这些都不是我想要的。
我一直在阅读/使用jQuery Deferred object并且我看到它在库本身中被大量使用来处理ajax请求和动画等。我理解一般功能并认为它已被证明是在某些情况下非常有用。 jQuery库使用这个概念非常优雅地解决了一些问题。
现在我的问题是:我认为对概述可以使用Deferred对象优雅且健壮地解决的不同问题/解决方案场景非常有用。
在哪种情况下使用jQuery Deferred的解决方案? javascript软件设计中哪些一般模式可以区分,可以使用jQuery Deferred功能最优雅地解决?我的目标是编制一个非常一般模式的列表(与非常具体的例子相反),本着每个OO分析师都知道的四种设计模式的精神。
在头脑后面列出这样的列表,在设计jQuery解决方案时,应该成为利用这些延迟模式的第二天性,就像桥梁,工厂......模式已经帮助我们设计灵活一样无需每次都重新发明轮子,都能提供强大的解决方案。
答案 0 :(得分:6)
异步任务大致分为5个不同的问题域。
可能是最常见的,并且很好地被Fabrizio Calderan的回答所覆盖。在这些情况下,我们必须处理至少2个结果,并且取决于粒度(请求的各种类型的成功或错误),然后对它们采取行动。
Deferred / Promises允许我们链接或并行化请求或两者的混合,以实现我们的任务所需的资源加载。例如,我们可以等待一系列请求完成,然后再加载一些,或者根据这些结果做其他事情。
链接/并行动画序列,更易于实现和维护。基于不同结果的条件步骤(当考虑用户交互或随机因素时)也易于实现和维护。
在浏览器中无法进行真正的模态操作,并且呈现对话框,向导等需要Deferred / Promises提供的异步操作,以便在清理之前对已解决的结果(成功,活动,选项,取消等)采取行动。显示(也简化,如已提到)并恢复正常操作。延迟/承诺允许您以相对简单的声明方式对这些结果采取行动。
实际上,这将用户交互与动画/显示序列相结合。
在调用服务之前,需要保证移动设备的可用性(例如通过PhoneGap),并且在许多情况下,异步提供响应。使用Deferred / Promises可以简化和改进管理这些设备交互的代码。
SQLLite特别提供了它对异步JS请求的响应,因此进行复杂的查询交互比使用回调要简单得多。
理论上,这适用于提供异步响应的任何辅助软件组件。
这是我读过Deferred / Promises的最好的文章之一,我建议您阅读它以获得一些适当深入的例子和解释。
Deferred / Promises的最大好处是,他们首先为几个领域提供了更容易构思的解决方案,并在之后进行维护。在某些情况下,他们如此简化,如果他们尝试使用回调和复杂的结果检查,许多成年人(可能还有一些小孩)
如果解决方案需要链接,等待一个或多个进程的结果解决,或者这些进程的任何组合,Deferred / Promises将为您节省挫折和痛苦,并且对于继承您的代码的任何人都会这样做。< / p>
现在出去,通过犯下可怕的虐待来证明我是错的。不,真的,不要那样做。编写干净,可维护的代码。
免责声明:在您的代码中使用延迟/承诺可能不会让您觉得“在船上”,但它会比回调的汤感觉更好
答案 1 :(得分:4)
在哪种情况下使用jQuery Deferred调用
的解决方案
我认为这是一个拇指规则,每次你都有
您可以尝试根据延迟对象和承诺重构代码。可以最多使用延迟对象的最常见场景是
load
事件中执行的资产和操作(例如像这样的图片预加载器:https://gist.github.com/958683)promise()
方法链接到animate()
方法即可轻松实现返回使用done()
回调处理的承诺(说实话我无法弄清楚动画如何失败)希望这个提示在某种程度上有用。