Promise A+中文翻譯

非常兔發表於2018-08-01

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 onFulfilledonRejected都是可選的引數:

  • 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)僅包含平臺程式碼之前,不得呼叫 onFulfilledonRejected 3.1

2.2.5 onFulfilledonRejected必須被當做函式呼叫(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 如果onFulfilledonRejected返回一個值x, 執行 Promise Resolution Procedure [[Resolve]](promise2, x) 2.3
  • 2.2.7.2 如果onFulfilledonRejected丟擲一個異常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 如果promisex引用同一個物件,則用TypeError作為原因拒絕(reject)promise

2.3.2 如果x是一個promise,採用promise的狀態3.4

  • 2.3.2.1 如果x是請求狀態(pending),promise必須保持pending直到xfulfilled或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作為原因reject promise
  • 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 如果resolvePromiserejectPromise都被呼叫,或者對同一個引數進行多次呼叫,第一次呼叫執行,任何進一步的呼叫都被忽略
    • 2.3.3.3.4 如果呼叫then丟擲一個異常e,
      • 2.3.3.3.4.1 如果resolvePromiserejectPromise已被呼叫,忽略。
      • 2.3.3.3.4.2 或者, 用e作為reason拒絕(reject)promise
  • 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執行程式碼。在實踐中,此要求確保onFulfilledonRejected 能夠非同步執行,在then被呼叫之後傳入事件環,並使用新的棧。這可以使用諸如setTimeoutsetImmediate之類的“巨集任務”機制, 或者使用諸如MutationObserverprocess.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: 非常兔

相關文章