Promise A+中文翻譯

Try to translate Promise A+ into Chinese 歡迎指正!
English version: Promise A+
My github linkgit

Promise A+

這是實施者爲實施者提供的開源健全可互操做的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

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)bash

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: 很是兔

相關文章
相關標籤/搜索