Javascript Promise 与 jQuery Deferred
Javascript Promise vs jQuery Deferred
Javascript Promise 与 jQuery 延迟对象的优缺点是什么?
例如,他们各自有什么问题?
一位堆栈溢出成员说:
"...real promises are real, and fake promises are fake."
他这是什么意思?
JavaScript 承诺更好,因为它符合标准。总有一天,它们将在所有浏览器上原生可用。现在你可以使用像 babel 这样的工具来使用 ES6 Promises:https://babeljs.io/docs/learn-es2015/#promises.
没有 "real promise" 或 "fake promise" 这样的东西。有 遵循当前标准 的 promise 实现,也有 不遵循当前标准 的 promise 实现。承诺没有固有属性表明它是 "real" 或 "fake"。它们是实现标准行为的 Javascript 的位。
任何严格遵循标准的 promise 实现都应该可以很好地使用,并且应该可以与其他标准 promise 实现互操作。大多数人会认为互操作性和遵守公认标准是一个有用的特性。
现在,jQuery promises 不遵循 promise 标准,这就是一些人谈论 jQuery promises 的地方。他们显然正在努力使 jQuery 的未来版本更加标准,但他们目前在许多方面都偏离了标准。这导致的问题是,使用 jQuery promises 与使用标准 promises 时,您必须编写不同的代码。所以 jQuery promise 代码看起来与 ES6 promise 代码不一样。
jQuery 承诺中的问题
有关当前 jQuery 承诺的问题列表,请参阅 this reference。两个主要问题是拒绝承诺中的错误处理问题和.then()
回调的执行顺序不一致,这可能导致不可预测或不一致的代码执行。所有 .then()
处理程序都应该异步执行(在 JS 的当前线程展开之后)。 jQuery 承诺并不总是这样做,它可能会导致某些类型的代码出现问题。
浏览器中原生 Promise 的状态
本机承诺在浏览器中是一种新事物,因此您还不能完全相信所有可能访问您网站的浏览器都必然内置本机承诺这一事实。本机承诺内置于以 Safari 7.1、Firefox 29、Chrome 32、Edge、Android 4.4.4、IOS 8.4 开头且在 IE 中尚不可用的浏览器(截至 2015 年 9 月)。因此,您仍然需要一个相当新的浏览器才能获得本机承诺支持。因此,有许多优秀的 promise 库可以提供 polyfill 或完全替代,从而使您的代码能够在任何浏览器中使用 promises,与原生 promises 相比没有任何妥协。
Javascript Promise 与 jQuery 延迟对象的优缺点是什么?
例如,他们各自有什么问题?
一位堆栈溢出成员说:
"...real promises are real, and fake promises are fake."
他这是什么意思?
JavaScript 承诺更好,因为它符合标准。总有一天,它们将在所有浏览器上原生可用。现在你可以使用像 babel 这样的工具来使用 ES6 Promises:https://babeljs.io/docs/learn-es2015/#promises.
没有 "real promise" 或 "fake promise" 这样的东西。有 遵循当前标准 的 promise 实现,也有 不遵循当前标准 的 promise 实现。承诺没有固有属性表明它是 "real" 或 "fake"。它们是实现标准行为的 Javascript 的位。
任何严格遵循标准的 promise 实现都应该可以很好地使用,并且应该可以与其他标准 promise 实现互操作。大多数人会认为互操作性和遵守公认标准是一个有用的特性。
现在,jQuery promises 不遵循 promise 标准,这就是一些人谈论 jQuery promises 的地方。他们显然正在努力使 jQuery 的未来版本更加标准,但他们目前在许多方面都偏离了标准。这导致的问题是,使用 jQuery promises 与使用标准 promises 时,您必须编写不同的代码。所以 jQuery promise 代码看起来与 ES6 promise 代码不一样。
jQuery 承诺中的问题
有关当前 jQuery 承诺的问题列表,请参阅 this reference。两个主要问题是拒绝承诺中的错误处理问题和.then()
回调的执行顺序不一致,这可能导致不可预测或不一致的代码执行。所有 .then()
处理程序都应该异步执行(在 JS 的当前线程展开之后)。 jQuery 承诺并不总是这样做,它可能会导致某些类型的代码出现问题。
浏览器中原生 Promise 的状态
本机承诺在浏览器中是一种新事物,因此您还不能完全相信所有可能访问您网站的浏览器都必然内置本机承诺这一事实。本机承诺内置于以 Safari 7.1、Firefox 29、Chrome 32、Edge、Android 4.4.4、IOS 8.4 开头且在 IE 中尚不可用的浏览器(截至 2015 年 9 月)。因此,您仍然需要一个相当新的浏览器才能获得本机承诺支持。因此,有许多优秀的 promise 库可以提供 polyfill 或完全替代,从而使您的代码能够在任何浏览器中使用 promises,与原生 promises 相比没有任何妥协。