Promise A+ 中文翻譯

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

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 順序來調用this

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看成緣由es5

  • 2.2.7.3 若是onFulfilled不是一個方法,而且promise1已經完成(fulfilled),
    promise2必須使用與promise1相同的值來完成(fulfiled)
  • 2.2.7.4 若是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),執行如下步驟:

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  若是/當 <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>
  • 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: 很是兔
My github link
My juejin link
相關文章
相關標籤/搜索