Promise表示异步操做的最终结果。与promise进行交互的主要方式是经过其then
方法,该方法注册回调以接收promise
的最终值或没法履行promise
的缘由。git
该规范详细说明了该then
方法的行为,提供了一个可互操做的基础,能够依赖全部Promises/A+符合的promise实现来提供。所以,应该认为规范很是稳定。尽管Promises/A+组织可能会偶尔修改此规范,并进行微小的向后兼容更改以解决新发现的极端状况,但只有通过仔细考虑,讨论和测试后,咱们才会集成大型或向后不兼容的更改。github
从历史上看,Promises/A+澄清了早期Promises/A提案的行为条款,将其扩展到涵盖事实上的行为并省略了未指明或有问题的部分。算法
最后,核心Promises/A+规范没有涉及如何建立,实现或拒绝Promise,而是选择专一于提供可互操做的then
方法。配套规范中的将来工做可能涉及这些主题。promise
1.术语
then
方法的对象或函数,其行为符合本规范。then
方法的对象或函数。(promise是thenable对象)undefined
,thenable或promise)。throw
语句抛出的值。2.要求
Promise必须处于如下三种状态之一: pending, fulfilled 或 rejected。bash
在这里,“毫不能改变”意味着不可改变的身份(即===
),但并不意味着深度的不变性。(引用类型地址不变)异步
then
方法promise必须提供一种then
方法来访问其当前或最终的value或reason。
promise的then
方法接受两个参数:函数
promise.then(onFulfilled, onRejected)
复制代码
onFulfilled
和onRejected
可选的参数:onFulfilled
不是函数,则必须忽略它。onRejected
不是函数,则必须忽略它。onFulfilled
是一个函数:promise
完成后调用,promise
的value做为第一个参数。promise
完成以前不得调用它。onRejected
是一个函数:promise
被拒绝后被调用,promise
的reason做为第一个参数。promise
拒绝以前不得调用它。onFulfilled
或者onRejected
在执行上下文堆栈仅包含平台代码以前不得调用。(链式调用,then方法返回一个新的promise对象,须要等新promise对象实例化结束后才能调用then的回调函数) 3.1 。onFulfilled
而且onRejected
必须做为函数调用(即没有this
值)。 3.2 then
能够在同一个promise
上屡次调用。promise
是fulfilled状态,则全部相应的onFulfilled
回调必须按原始顺序执行then
。onRejected
回调必须按原始的顺序执行then
。then
必须返回一个promise
3.3 。promise2 = promise1.then(onFulfilled, onRejected);
复制代码
onFulfilled
或onRejected
返回一个值x
(x
多是promise
,因此须要增长处理函数),运行Promise
解决程序[[Resolve]](promise2, x)
。onFulfilled
或者onRejected
抛出异常e
,将e
做为promise2
rejected的reason。onFulfilled
不是一个函数而且promise1
已经完成,则promise2
必须使用与promise1
相同的value来fulfilled。onRejected
不是一个函数而promise1
被拒绝,promise2
必须与promise1
以一样的reason来rejected。promise解决程序是一个函数,参数为一个promise和一个value,它表示为[[Resolve]](promise,x)
。若是x
是一个thenable(promise
),它会尝试promise
采用x
的状态,前提是x
行为至少有点像promise
。不然,它做为promise
的fulfilled的value返回。测试
对thenables的这种处理容许promise实现进行互操做,只要它们公开Promise/A+兼容then
方法便可。它还容许Promises/A+实现使用合理的then
方法“同化”不一致的实现。this
promise
和x
引用同一个对象,请以promise TypeError
为reason来rejected。x
是promise
,采用其状态 3.4 :x
待处理pending,则promise
必须保持待处理状态,直到x
fulfilled或rejected为止。x
fulfilled,则promise
使用相同的value fulfilled。x
rejected,请promise
以一样的reason rejected。x
是对象或函数:then = x.then
。 3.5 x.then
中抛出的异常的结果e
,将e
做为 promise
的reason来rejected。then
是函数,将x
做为this
调用它,第一个参数resolvePromise
和第二个参数rejectPromise
,其中:
resolvePromise
被调用并返回一个值y
(原理同x
,可能为promise
),则运行[[Resolve]](promise, y)
。rejectPromise
被调用并是带一个reasonr
,将r
做为拒绝promise
的reason。resolvePromise
和rejectPromise
被调用,或屡次调用相同的参数,则第一次调用优先,任何进一步的调用将被忽略。then
抛出异常e
:
resolvePromise
或rejectPromise
已被调用,请忽略它。e
做为promise
的rejected的reason。then
不是一个函数,将x
做为promise
fulfilled的value。x
不是一个对象或函数,将x
做为promise
的fulfilled的value。若是使用参与循环可变链的thenable来解决promise,使得[[Resolve]](promise, thenable)
最终致使[[Resolve]](promise,thenable)
再次调用的递归性质,遵循上述算法将致使无限递归。鼓励但不要求实现以检测这种递归并拒绝promise
提供信息TypeError
做为缘由。 3.6 es5
3.笔记
3.1. 这里的“平台代码”意味着引擎,环境和promise实现代码。在实践中,此要求确保在调用事件循环而且使用新堆栈以后异步执行onFulfilled
和onRejected
执行then
。这能够用“宏任务”机制实现,例如setTimeout
或者setImmediate
,或者用“微任务”机制,例如MutationObserver
或process.nextTick
。因为promise
实现被认为是平台代码,所以它自己可能包含一个任务调度队列或“trampoline”,其中调用处理程序。
3.2.也就是说,严格模式this
将undefined
在其中;在草率模式下,它将成为全局对象。
3.3. promise2 === promise1
只要实现知足全部要求,实现能够容许。每一个实施应记录它是否能够生产promise2 === promise1
以及在什么条件下生产。
3.4. 通常来讲,x
若是它来自当前的实现,那么它只是一个真正的promise
。该子句容许使用特定于实现的方法来采用已知符合的promise
的状态。
3.5. 此过程首先存储引用x.then
,而后测试该引用,而后调用该引用,避免屡次访问该x.then
属性。这些预防措施对于确保访问者属性的一致性很是重要,访问者属性的值可能会在检索之间发生变化。
3.6. 实现应不设置thenable链的深度任何限制,并假设超出任何限制递归将是无限的。只有真正的周期才能致使TypeError
;若是遇到无限的不一样的可能的链,那么永远递归就是正确的行为。