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