Javascript Promise vs jQuery Deferred

13

Javascript Promise与jQuery Deferred Objects有哪些优缺点?

例如,它们各自存在什么问题(如果有的话)?

堆栈溢出成员表示:

"...真正的Promise是真实的,假的Promise是假的。"

他的意思是什么?


有人可能是对的,但这不是解决争论的好方法。黎明时分拔枪相向。 - Pointy
有个人误解了,仅仅因为IE不支持JavaScript Promise并且它还不够成熟。将来他会是正确的。 - Saar
@Pointy,哈哈,好吧,我是真的在寻找答案(不是想辩论这个问题)。如果他是对的,我想知道为什么,而不是依赖他神秘的回答。 - picokol
1
@Saar 你说得没错,原生的 Promise 并不是普遍被支持的,但是原生 Promise 和 jQuery 的 Promise/Deferred 在工作方式上有重要的区别。 - Pointy
1
请查看这个实际差异列表,然后再看看许多固有的jQuery $.Deferred问题 - Bergi
显示剩余3条评论
2个回答

16

不存在所谓的“真实承诺”或“假承诺”。有些承诺实现遵循当前标准,有些则不遵循当前标准。没有承诺的固有属性表明它是“真实的”或“假的”。它们只是实现标准行为的JavaScript位。

任何严格遵循标准的承诺实现都应该可以使用,并且应该与其他标准承诺实现互操作。大多数人会认为互操作性和遵守公认标准是一个有用的特性。

现在,jQuery承诺不遵循承诺标准,这就是一些人谈论jQuery承诺的缺点之处。他们显然正在努力使它们更符合未来版本的jQuery标准,但它们当前在许多方面偏离了标准。这导致问题,因为当使用jQuery承诺时,必须以不同的方式编写代码,而不是使用标准承诺时的编写方式。因此,jQuery承诺代码看起来与ES6承诺代码不同。

jQuery承诺的问题

请参见此参考资料,以获取当前jQuery承诺的问题列表。两个主要问题是拒绝的承诺中的错误处理问题.then()回调执行顺序的不一致性可能会导致代码执行的不可预测或不一致的情况。所有.then()处理程序都应该是异步执行的(在当前JS线程解开之后)。jQuery承诺并不总是这样做,这可能会在某些类型的代码中引起问题。

浏览器中原生承诺的状态

原生 Promise 在浏览器中还比较新,因此您不能仅依赖于所有可能访问您的网站的浏览器都必定内置了原生 Promise。原生 Promise 从 Safari 7.1、Firefox 29、Chrome 32、Edge、Android 4.4.4、IOS 8.4 开始内置,但截至2015年9月,IE 尚未支持。因此,您仍需要一个相当新的浏览器才能支持原生 Promise。因此,有许多出色的 Promise 库可以提供 polyfill 或完全替换,使您的代码能够在任何浏览器中使用 Promise,而几乎没有与原生 Promise 的妥协。


我希望这里能够包含一些关于JavaScript Promise的注释,现在大多数浏览器都原生支持它,包括微软的新Edge,但是旧版浏览器(IE)始终存在兼容性问题。除此之外,我认为这是对我的问题的很好回答。 - picokol
@picokol - 我增加了一条关于浏览器中原生 Promise 状态的注释。 - jfriend00
微任务怎么样? - Sava Jcript
@SavaJcript - 微任务怎么样? - jfriend00

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接