jquery - jQuery Deferred and Promises是什么设计模式?

标签 jquery design-patterns promise jquery-deferred

看来jQuery的Deferred实际上可以处理Deferred对象和Promise对象可以执行的所有方法,但是它仅向用户返回Promise对象,以便提供方法的子集,从而用户无法解析或拒绝对于用户不应该做的事情。

因此,Deferred实际上是一个非常清晰的类。可能令人困惑的是另一个类Promise,它使事情看起来更加复杂,因为现在这种模式有两个类,而且看起来似乎很困惑。

我想知道

  • 以上准确吗?
  • 是它自己的设计模式,还是实际上与实际上具有此“许多方法”的其他经典设计模式类似(延迟),但“仅将其子集限制给该类的用户” ( promise )什么样的设计模式?
  • 最佳答案

    jQuery的 promise 部分由包括Q promise ,Dojo和Twisted Python递延的现有技术提供,这些先验技术反过来又受E中的 promise 启发。在E和随后的Q中,promise和resolver是基于对象能力编程(OCap)的单独对象)设计原则。在Q中,promiseresolve是单独的承载能力的对象,“递延”只是这些能力的容器。在ES6 Promise设计中,延迟存在但不存在以消除混淆的接口(interface)—相反,promise构造函数采用回调方法,将resolve作为参数发送至该回调。

    E是为在多个过程中面向对象的安全性和代理的可靠组合而设计的。 promise 是确保E达到所有目标的重要基础。对象能力范式是访问控制列表范式的替代方法。将功能分解为单个对象,而不是面向用户的权限。授予权限就像授予代理访问具有功能的对象的权限一样简单,并且OCap依赖于这样一种环境,即可以保证只有通过与其他对象进行显式和蓄意的交互才能获得功能。使用弱映射(以确保内存不泄漏)和代理(以创建始终包裹跨膜引用并可以在以后打破的边界)创建的对象膜,也可以撤消权限。

    观察和通知是独立的功能。可以赋予某些代理人观察 promise 解决的权力,并赋予其他代理人解决 promise 的能力。在安全系统中,重要的是通信 channel 是单向的。一个解析器可以将一个值传递给所有观察者,但是任何观察者或解析器都不能以其他方式干扰任何其他代理的不变量。

    promise 是Gamma et Al Observer模式或Publisher,Subscriber模式的变体。还有一些值得注意的附加约束。许诺是广播发布者。可以通知多个观察者。 promise 还保证只解决或拒绝一项决议。与PubSub不同,promise会通知观察者,而不管它是在发出该决议之前还是之后开始观察。与事件发射器不同,promise确保异步。在DOM和Node.js中,事件发射器通常都是同步的。

    为了强大的组合和安全性,promise保证所有处理程序都将在单独的事件中被调用。这样可以防止函数以多种方式干扰共享同一调用栈的其他实体,例如调用在函数返回之前未必已建立的状态关闭的函数,或者检查其自身的栈以推断其他代理是做。

    大多数JavaScript环境不足以满足Promise设计的安全性保证。 Google Caja和DrSES是创建此类环境的项目。但是,Q Promise被设计为与原始设计兼容,从而可以更轻松地将为Q用户编写的代码移植到此类环境中。出于同样的原因,与其他JavaScript Promise库不同,Q的设计也类似于E Promise,它基于消息传递“内核”,允许它们用于将消息发送到其他进程中的对象,并返回结果的Promise。用作进一步发送结果消息的代理。

  • http://en.wikipedia.org/wiki/Object-capability_model
  • http://erights.org/elib/capability/ode/ode-capabilities.html

  • jQuery接受了promises,但仅部分赞赏了现有技术。 jQuery中的promise是根据jQuery自己的事件分配模式重新评估的,默认情况下具有多个输入和输出,这打破了一个类推,即promise与函数调用的结果相对应,返回值或抛出的异常。 jQuery Promise也不会捕获异常,因此,如果应该通知观察者失败,则必须显式创建“拒绝”。这使得某些代理无法从某些错误中恢复。 jQuery还决定遵循Dojo和Twisted将Promise和resolver合并为一个对象,目的是使界面更易于使用。 jQuery Promise最初并未为已实现或已拒绝处理程序的返回值创建新的Promise,但后来纠正了该错误。

    关于jquery - jQuery Deferred and Promises是什么设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22284803/

    相关文章:

    javascript - 在 SPA 站点中保持 2 个导航菜单同步

    c++ - 适配器模式 : Why would we need to subclass the Adaptee?

    c++ - 抽象工厂模式中将工厂方法插入哪里?

    javascript - ajax查询将对象键值更改为索引

    javascript - jQuery 读取非空和可见的文本字段

    javascript - 如何让 jQuery 在处理图像之前等待图像列表加载?

    node.js - NodeJS + EJS + Promise : page is not displayed until the promise is fulfilled

    javascript - 无法使用 JavaScript promise 读取未定义的属性 'then'

    jquery - 函数作为 jQuery 中 $ 的参数

    c# - 如何为一个列表中的不同类型的值设计工厂模式?