Try to translate Promise A+ into Chinese 歡迎指正!
English version: Promise A+
My github link
Promise A+
這是實施者為實施者提供的開源健全可互操作的JavaScript Promise 規範。
Promise代表著非同步操作的最終結果。與promise進行互動的主要方式是通過then
方法,
該方法通過註冊回撥以接收promise的最終值或promise未完成的原因。
該規範詳細說明了then
方法的行為,它可以依賴所有符合Promises / A +的promise實現來提供可互操作的基礎庫。 因此,可以認為規範非常穩定。 儘管Promises / A +組織可能偶爾會修
改此規範,並採用較小的向後相容的更改來解決新發現的極端情況。但只有經過仔細考慮,討論和測試後,
我們才會整合大型或向後不相容的更改。
從歷史上看,Promises / A +澄清了早期Promises / A提案的行為條款, 將其擴充套件到涵蓋事實上的行為並省略了未指明或有問題的部分。
最後,核心Promises / A +規範沒有涉及如何建立,實現或拒絕(create, fulfill, or reject ) promises,而是選擇專注於提供可互動操作的then
方法。
配套規範中的未來工作可能涉及這些主題。
1. 術語
- 1.1 "promise"是具有
then
方法的物件或函式,其行為符合此規範。 - 1.2 "thenable"是定義
then
方法的物件或函式。 - 1.3 "value"是任意合法的Javascript值,(包括
undefined
,thenable, promise) - 1.4 "exception"是使用
throw
語句丟擲的值 - 1.5 "reason"是表示promise為什麼被rejected的值
2. 要求
2.1 Promise狀態
一個promise必須處於三種狀態之一: 請求態(pending), 完成態(fulfilled),拒絕態(rejected)
2.1.1 當promise處於請求狀態(pending)時
- 2.1.1.1 promise可以轉為fulfilled或rejected狀態
2.1.2 當promise處於完成狀態(fulfilled)時
- 2.1.2.1 promise不能轉為任何其他狀態
- 2.1.2.2 必須有一個值,且此值不能改變
2.1.3 當promise處於拒絕狀態(rejected)時
- 2.1.3.1 promise不能轉為任何其他狀態
- 2.1.3.2 必須有一個原因(reason),且此原因不能改變
2.2 then
方法
promise必須提供then
方法來存取它當前或最終的值或者原因。
promise的then
方法接收兩個引數:
promise.then(onFulfilled, onRejected)
複製程式碼
2.2.1 onFulfilled
和onRejected
都是可選的引數:
- 2.2.1.1 如果
onFulfilled
不是函式,必須忽略 - 2.2.1.1 如果
onRejected
不是函式,必須忽略
2.2.2 如果onFulfilled
是函式:
- 2.2.2.1 此函式必須在
promise
完成(fulfilled)後被呼叫,並把promise
的值作為它的第一個引數 - 2.2.2.2 此函式在
promise
完成(fulfilled)之前絕對不能被呼叫 - 2.2.2.2 此函式絕對不能被呼叫超過一次
2.2.3 如果onRejected
是函式:
- 2.2.2.1 此函式必須在
promise
rejected後被呼叫,並把promise
的reason作為它的第一個引數 - 2.2.2.2 此函式在
promise
rejected之前絕對不能被呼叫 - 2.2.2.2 此函式絕對不能被呼叫超過一次
2.2.4 在執行上下文堆疊(execution context)僅包含平臺程式碼之前,不得呼叫 onFulfilled
和onRejected
3.1
2.2.5 onFulfilled
和onRejected
必須被當做函式呼叫(i.e. with no this value-->這裡不會翻......). 3.2
2.2.6 then
可以在同一個promise裡被多次呼叫
- 2.2.6.1 如果/當
promise
完成執行(fulfilled),各個相應的onFulfilled
回撥 必須根據最原始的then
順序來呼叫 - 2.2.6.2 如果/當
promise
被拒絕(rejected),各個相應的onRejected
回撥 必須根據最原始的then
順序來呼叫
2.2.7 then
必須返回一個promise 3.3
promise2 = promise1.then(onFulfilled, onRejected);
複製程式碼
- 2.2.7.1 如果
onFulfilled
或onRejected
返回一個值x
, 執行 Promise Resolution Procedure[[Resolve]](promise2, x)
2.3 - 2.2.7.2 如果
onFulfilled
或onRejected
丟擲一個異常e
,promise2
必須被拒絕(rejected)並把e
當作原因 - 2.2.7.3 如果
onFulfilled
不是一個方法,並且promise1
已經完成(fulfilled),promise2
必須使用與promise1
相同的值來完成(fulfiled) - 2.2.7.4 如果
onRejected
不是一個方法,並且promise1
已經被拒絕(rejected),promise2
必須使用與promise1
相同的原因來拒絕(rejected)
2.3 Promise解決程式
promise解析過程 是一個抽象操作,它將promise和value作為輸入,我們將其表示為[[Resolve]](promise,x)
。
如果x
是thenable的,假設x
的行為至少有點像promise
,
它會嘗試讓promise
採用x
的狀態。不然就會用x
來完成promise
只要它們公開一個Promises / A +相容的方法,對thenables的這種處理允許promise實現進行互操作,
它還允許Promises / A +實現使用合理的then
方法“同化”不一致的實現。
執行[[Resolve]](promise, x)
,執行以下步驟:
2.3.1 如果promise
和x
引用同一個物件,則用TypeError
作為原因拒絕(reject)promise
。
2.3.2 如果x
是一個promise,採用promise的狀態3.4
- 2.3.2.1 如果
x
是請求狀態(pending),promise
必須保持pending直到x
fulfilled或rejected - 2.3.2.2 如果
x
是完成態(fulfilled),用相同的值完成fulfillpromise
- 2.3.2.2 如果
x
是拒絕態(rejected),用相同的原因rejectpromise
2.3.3另外,如果x
是個物件或者方法
- 2.3.3.1 讓
x
作為x.then
. 3.5 - 2.3.3.2 如果取回的
x.then
屬性的結果為一個異常e
,用e
作為原因rejectpromise
- 2.3.3.3 如果
then
是一個方法,把x
當作this
來呼叫它, 第一個引數為resolvePromise
,第二個引數為rejectPromise
,其中:- 2.3.3.3.1 如果/當
resolvePromise
被一個值y
呼叫,執行[[Resolve]](promise, y)
- 2.3.3.3.2 如果/當
rejectPromise
被一個原因r
呼叫,用r
拒絕(reject)promise
- 2.3.3.3.3 如果
resolvePromise
和rejectPromise
都被呼叫,或者對同一個引數進行多次呼叫,第一次呼叫執行,任何進一步的呼叫都被忽略 - 2.3.3.3.4 如果呼叫
then
丟擲一個異常e
,- 2.3.3.3.4.1 如果
resolvePromise
或rejectPromise
已被呼叫,忽略。 - 2.3.3.3.4.2 或者, 用
e
作為reason拒絕(reject)promise
- 2.3.3.3.4.1 如果
- 2.3.3.3.1 如果/當
- 2.3.3.4 如果
then
不是一個函式,用x
完成(fulfill)promise
2.3.4 如果 x
既不是物件也不是函式,用x
完成(fulfill)promise
如果一個promise被一個thenable resolve,並且這個thenable參與了迴圈的thenable環,
[[Resolve]](promise, thenable)
的遞迴特性最終會引起[[Resolve]](promise, thenable)
再次被呼叫。
遵循上述演算法會導致無限遞迴,鼓勵(但不是必須)實現檢測這種遞迴併用包含資訊的TypeError
作為reason拒絕(reject)3.6
3.備註
3.1這裡的"平臺程式碼"
指的是引擎,環境和promise執行程式碼。在實踐中,此要求確保onFulfilled
和onRejected
能夠非同步執行,在then
被呼叫之後傳入事件環,並使用新的棧。這可以使用諸如setTimeout
或setImmediate
之類的“巨集任務”機制,
或者使用諸如MutationObserver
或process.nextTick
之類的“微任務”機制來實現。
由於promise實現被認為是平臺程式碼,因此它本身可能包含一個任務排程佇列或呼叫處理程式的“trampoline”。
3.2 沒有this的情況
也就是說,在嚴格模式下,this
是未定義的; 在寬鬆模式下,它將成為全域性物件。
3.3 then必須返回promise
在例項滿足所有要求的情況下,可以允許promise2 === promise1
.
每個例項都必須表明是否能實現,以及在什麼情況下,promise2 === promise1
???
3.4 關於x
通常,當x
來自當前的例項時,x
才是真正的promise
This clause allows the use of implementation-specific means to adopt the state of known-conformant promises
3.5 關於x.then
這個流程首先儲存x.then
的引用,
然後測試這個引用,然後呼叫這個引用,避免多次獲取x.then
屬性。
這些預防措施對於確保訪問者屬性的一致性非常重要,訪問者屬性的值可能在檢索之間發生變化。
3.6 如何對待thenable chain
例項不應該對thenable 鏈的深度設定任意限制,並假設遞迴超出任意限制,遞迴會無窮。只有真正的迴圈才會導致TypeError
.
如果遇到thenbles的無限鏈,那麼永遠遞迴就是正確的行為。
本人首次翻譯,歡迎批評指正。
Author: Yanni Jia
Nickname: 非常兔