Promise表示一个异步操做的最终结果。与Promise最主要的交互方法是经过将函数传入它的then方法从而获取得Promise最终的值或Promise最终最拒绝(reject)的缘由。git
promise
是一个包含了兼容promise规范then方法的对象或函数,thenable
是一个包含了then方法的对象或函数。value
是任何Javascript值。 (包括 undefined, thenable, promise等).exception
是由throw
表达式抛出来的值。reason
是一个用于描述Promise被拒绝缘由的值。github
一个Promise必须处在其中之一的状态:pending, fulfilled 或 rejected.promise
”值不能被改变”指的是其identity不能被改变,而不是指其成员内容不能被改变。异步
then
方法一个Promise必须提供一个then方法来获取其值或缘由。
Promise的then方法接受两个参数:ide
jspromise.then(onFulfilled, onRejected)
onFulfilled
和 onRejected
都是可选参数:onFulfilled
不是一个函数,则忽略之。onRejected
不是一个函数,则忽略之。onFulfilled
是一个函数:promise
fulfilled后调用, 且promise
的value为其第一个参数。promise
fulfilled前调用。onRejected
是一个函数,promise
rejected后调用, 且promise
的reason为其第一个参数。promise
rejected前调用。onFulfilled
和 onRejected
只容许在 execution context 栈仅包含平台代码时运行. [3.1].onFulfilled
和 onRejected
必须被当作函数调用 (i.e. 即函数体内的 this
为undefined
). [3.2]promise
,它的then方法能够调用屡次.promise
fulfilled后,全部onFulfilled
都必须按照其注册顺序执行。promise
rejected后,全部OnRejected
都必须按照其注册顺序执行。then
必须返回一个promise [3.3].函数
jspromise2 = promise1.then(onFulfilled, onRejected);
onFulfilled
或 onRejected
返回了值x
, 则执行Promise 解析流程[[Resolve]](promise2, x)
.onFulfilled
或 onRejected
抛出了异常e
, 则promise2
应当以e
为reason
被拒绝。onFulfilled
不是一个函数且promise1
已经fulfilled,则promise2
必须以promise1
的值fulfilled.OnReject
不是一个函数且promise1
已经rejected, 则promise2
必须以相同的reason被拒绝.Promise解析过程 是以一个promise和一个值作为参数的抽象过程,可表示为[[Resolve]](promise, x)
. 过程以下;测试
promise
和 x
指向相同的值, 使用 TypeError
作为缘由将promise
拒绝。x
是一个promise
, 采用其状态 [3.4]:x
是pending状态,promise
必须保持pending走到x
fulfilled或rejected. x
是fulfilled状态,将x
的值用于fulfill promise
.x
是rejected状态, 将x
的缘由用于reject promise
..x
是一个对象或一个函数:then
赋为 x.then
. [3.5]x.then
值时抛出了异常,则以这个异常作为缘由将promise
拒绝。then
是一个函数, 以x
为this
调用then
函数, 且第一个参数是resolvePromise
,第二个参数是rejectPromise
,且:resolvePromise
被以 y
为参数调用, 执行 [[Resolve]](promise, y)
.rejectPromise
被以 r
为参数调用, 则以r
为缘由将promise
拒绝。resolvePromise
和 rejectPromise
都被调用了,或者被调用了屡次,则只第一次有效,后面的忽略。then
时抛出了异常,则:resolvePromise
或 rejectPromise
已经被调用了,则忽略它。e
为reason将 promise
拒绝。then
不是一个函数,则 以x
为值fulfill promise
。x
不是对象也不是函数,则以x
为值 fulfill promise
。英文原文地址:http://promisesaplus.com
若要了解文中每一条规则,则参阅其测试仓库:https://github.com/promises-aplus/promises-tests/tree/master/lib/teststhis