一、什么是 Promise
1.1 Promise
的前世今生
Promise
最早出现在 1988 年,由 Barbara Liskov、Liuba Shrira 首创(论文:Promises: Linguistic Support for Efficient Asynchronous Procedure Calls in Distributed Systems)。并且在语言 MultiLisp 和 Concurrent Prolog 中已经有了类似的实现。
JavaScript 中,Promise
的流行是得益于 jQuery 的方法 jQuery.Deferred()
,其他也有一些更精简独立的 Promise
库,例如:Q、When、Bluebird。
# Q / 2010 import Q from 'q' function wantOdd () { const defer = Q.defer() const num = Math.floor(Math.random() * 10) if (num % 2) { defer.resolve(num) } else { defer.reject(num) } return defer.promise } wantOdd() .then(num => { log(`Success: ${num} is odd.`) // Success: 7 is odd. }) .catch(num => { log(`Fail: ${num} is not odd.`) })
由于 jQuery 并没有严格按照规范来制定接口,促使了官方对 Promise
的实现标准进行了一系列重要的澄清,该实现规范被命名为 Promise/A+。后来 ES6(也叫 ES2015,2015 年 6 月正式发布)也在 Promise/A+ 的标准上官方实现了一个 Promise
接口。
new Promise( function(resolve, reject) {...} /* 执行器 */ );
想要实现一个 Promise
,必须要遵循如下规则:
Promise
是一个提供符合标准的then()
方法的对象。- 初始状态是
pending
,能够转换成fulfilled
或rejected
状态。 - 一旦
fulfilled
或rejected
状态确定,再也不能转换成其他状态。 - 一旦状态确定,必须要返回一个值,并且这个值是不可修改的。
“讲讲 Promise”继续阅读