Try to translate Promise A+ into Chinese 歡迎指正!
English version: Promise A+
My github linkgit
這是實施者爲實施者提供的開源健全可互操做的JavaScript Promise 規範。es6
Promise表明着異步操做的最終結果。與promise進行交互的主要方式是經過then
方法, 該方法經過註冊回調以接收promise的最終值或promise未完成的緣由。
github
該規範詳細說明了then
方法的行爲,它能夠依賴全部符合Promises / A +的promise實現來提供可互操做的基礎庫。 所以,能夠認爲規範很是穩定。 儘管Promises / A +組織可能偶爾會修 改此規範,並採用較小的向後兼容的更改來解決新發現的極端狀況。但只有通過仔細考慮,討論和測試後, 咱們纔會集成大型或向後不兼容的更改。web
從歷史上看,Promises / A +澄清了早期Promises / A提案的行爲條款, 將其擴展到涵蓋事實上的行爲並省略了未指明或有問題的部分。算法
最後,核心Promises / A +規範沒有涉及如何建立,實現或拒絕(create, fulfill, or reject ) promises,而是選擇專一於提供可交互操做的then
方法。 配套規範中的將來工做可能涉及這些主題。promise
then
方法的對象或函數,其行爲符合此規範。then
方法的對象或函數。undefined
,thenable, promise)throw
語句拋出的值一個promise必須處於三種狀態之一: 請求態(pending), 完成態(fulfilled),拒絕態(rejected)bash
then
方法promise必須提供then
方法來存取它當前或最終的值或者緣由。
promise的then
方法接收兩個參數:異步
promise.then(onFulfilled, onRejected)
複製代碼
onFulfilled
和onRejected
都是可選的參數:onFulfilled
不是函數,必須忽略onRejected
不是函數,必須忽略onFulfilled
是函數:promise
完成(fulfilled)後被調用,並把promise
的值做爲它的第一個參數promise
完成(fulfilled)以前絕對不能被調用onRejected
是函數:promise
rejected後被調用,並把promise
的reason做爲它的第一個參數promise
rejected以前絕對不能被調用onFulfilled
和onRejected
3.1onFulfilled
和onRejected
必須被當作函數調用(i.e. with no this value-->這裏不會翻......). 3.2then
能夠在同一個promise裏被屢次調用promise
完成執行(fulfilled),各個相應的onFulfilled
回調 必須根據最原始的then
順序來調用promise
被拒絕(rejected),各個相應的onRejected
回調 必須根據最原始的then
順序來調用then
必須返回一個promise 3.3promise2 = promise1.then(onFulfilled, onRejected);
複製代碼
onFulfilled
或onRejected
返回一個值x
, 運行 Promise Resolution Procedure [[Resolve]](promise2, x)
2.3onFulfilled
或onRejected
拋出一個異常e
,promise2
必須被拒絕(rejected)並把e
看成緣由onFulfilled
不是一個方法,而且promise1
已經完成(fulfilled), promise2
必須使用與promise1
相同的值來完成(fulfiled)onRejected
不是一個方法,而且promise1
已經被拒絕(rejected), promise2
必須使用與promise1
相同的緣由來拒絕(rejected)promise解析過程 是一個抽象操做,它將promise和value做爲輸入,咱們將其表示爲[[Resolve]](promise,x)
。 若是x
是thenable的,假設x
的行爲至少有點像promise
, 它會嘗試讓promise
採用x
的狀態。否則就會用x
來完成promise
函數
只要它們公開一個Promises / A +兼容的方法,對thenables的這種處理容許promise實現進行互操做, 它還容許Promises / A +實現使用合理的then
方法「同化」不一致的實現。測試
運行[[Resolve]](promise, x)
,執行如下步驟:
promise
和x
引用同一個對象,則用TypeError
做爲緣由拒絕(reject)promise
。x
是一個promise,採用promise的狀態3.4x
是請求狀態(pending),promise
必須保持pending直到x
fulfilled或rejectedx
是完成態(fulfilled),用相同的值完成fulfillpromise
x
是拒絕態(rejected),用相同的緣由rejectpromise
x
是個對象或者方法x
做爲x.then
. 3.5x.then
屬性的結果爲一個異常e
,用e
做爲緣由reject promise
then
是一個方法,把x
看成this
來調用它, 第一個參數爲 resolvePromise
,第二個參數爲rejectPromise
,其中:
resolvePromise
被一個值y
調用,運行 [[Resolve]](promise, y)
rejectPromise
被一個緣由r
調用,用r
拒絕(reject)promise
resolvePromise
和 rejectPromise
都被調用,或者對同一個參數進行屢次調用,第一次調用執行,任何進一步的調用都被忽略then
拋出一個異常e
,
resolvePromise
或 rejectPromise
已被調用,忽略。e
做爲reason拒絕(reject)promise
then
不是一個函數,用x
完成(fulfill)promise
x
既不是對象也不是函數,用x
完成(fulfill)promise
若是一個promise被一個thenable resolve,而且這個thenable參與了循環的thenable環, [[Resolve]](promise, thenable)
的遞歸特性最終會引發[[Resolve]](promise, thenable)
再次被調用。 遵循上述算法會致使無限遞歸,鼓勵(但不是必須)實現檢測這種遞歸併用包含信息的TypeError
做爲reason拒絕(reject)3.6
onFulfilled
和
onRejected
可以異步執行,在
then
被調用以後傳入事件環,並使用新的棧。這可使用諸如
setTimeout
或
setImmediate
之類的「宏任務」機制, 或者使用諸如
MutationObserver
或
process.nextTick
之類的「微任務」機制來實現。 因爲promise實現被認爲是平臺代碼,所以它自己可能包含一個任務調度隊列或調用處理程序的「trampoline」。
this
是未定義的; 在寬鬆模式下,它將成爲全局對象。
promise2 === promise1
. 每一個實例都必須代表是否能實現,以及在什麼狀況下,
promise2 === promise1
???
x
來自當前的實例時,
x
纔是真正的
promise
This clause allows the use of implementation-specific means to adopt the state of known-conformant promises
x.then
的引用, 而後測試這個引用,而後調用這個引用,避免屢次獲取
x.then
屬性。 這些預防措施對於確保訪問者屬性的一致性很是重要,訪問者屬性的值可能在檢索之間發生變化。
TypeError
. 若是遇到thenbles的無限鏈,那麼永遠遞歸就是正確的行爲。
本人首次翻譯,歡迎批評指正。 Author: Yanni Jia Nickname: 很是兔