Javascript Promise与jQuery Deferred Objects有哪些优缺点?
例如,它们各自存在什么问题(如果有的话)?
堆栈溢出成员表示:
"...真正的Promise是真实的,假的Promise是假的。"
他的意思是什么?
Javascript Promise与jQuery Deferred Objects有哪些优缺点?
例如,它们各自存在什么问题(如果有的话)?
堆栈溢出成员表示:
"...真正的Promise是真实的,假的Promise是假的。"
他的意思是什么?
不存在所谓的“真实承诺”或“假承诺”。有些承诺实现遵循当前标准,有些则不遵循当前标准。没有承诺的固有属性表明它是“真实的”或“假的”。它们只是实现标准行为的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 Promises更好,因为它符合标准。未来,它们将在所有浏览器上本地可用。目前,您可以使用类似Babel的工具来使用ES6 Promises:https://babeljs.io/docs/learn-es2015/#promises。