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