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
;若是遇到無限的不一樣的可能的鏈,那麼永遠遞歸就是正確的行爲。