Promises/A+中文翻譯

實現者爲實施者提供開放的標準,實現可靠,可互操做的JavaScript Promise.

Promise表示異步操做的最終結果。與promise進行交互的主要方式是經過其then方法,該方法註冊回調以接收promise的最終值或沒法履行promise的緣由。git

該規範詳細說明了該then方法的行爲,提供了一個可互操做的基礎,能夠依賴全部Promises/A+符合的promise實現來提供。所以,應該認爲規範很是穩定。儘管Promises/A+組織可能會偶爾修改此規範,並進行微小的向後兼容更改以解決新發現的極端狀況,但只有通過仔細考慮,討論和測試後,咱們纔會集成大型或向後不兼容的更改。github

從歷史上看,Promises/A+澄清了早期Promises/A提案的行爲條款,將其擴展到涵蓋事實上的行爲並省略了未指明或有問題的部分。算法

最後,核心Promises/A+規範沒有涉及如何建立,實現或拒絕Promise,而是選擇專一於提供可互操做的then方法。配套規範中的將來工做可能涉及這些主題。promise

1.術語

  • 1.1. 「promise」是具備then方法的對象或函數,其行爲符合本規範。
  • 1.2. 「thenable」是定義then方法的對象或函數。(promise是thenable對象)
  • 1.3. 「value」是任何合法的JavaScript值(包括undefined,thenable或promise)。
  • 1.4. 「exception」是使用throw語句拋出的值。
  • 1.5. 「reason」是promise失敗的緣由。

2.要求

2.1.Promise狀態

Promise必須處於如下三種狀態之一: pending, fulfilled 或 rejected。bash

2.1.1. pending狀態時,Promise:
  • 2.1.1.1. 能夠過渡到fulfilled或rejected的狀態。
2.1.2. fulfilled狀態時,Promise:
  • 2.1.2.1. 不得過渡到任何其狀態。
  • 2.1.2.2. 必須有一個值(value),毫不能改變。
2.1.3. rejected狀態時,Promise:
  • 2.1.3.1. 不得過渡到任何其狀態。
  • 2.1.3.2. 必須有一個緣由(reason),毫不能改變。

在這裏,「毫不能改變」意味着不可改變的身份(即===),但並不意味着深度的不變性。(引用類型地址不變)異步

2.2.then方法

promise必須提供一種then方法來訪問其當前或最終的value或reason。
promise的then方法接受兩個參數:函數

promise.then(onFulfilled, onRejected)
複製代碼
2.2.1. 這兩個onFulfilledonRejected可選的參數:
  • 2.2.1.1. 若是onFulfilled不是函數,則必須忽略它。
  • 2.2.1.2. 若是onRejected不是函數,則必須忽略它。
2.2.2. 若是onFulfilled是一個函數:
  • 2.2.2.1. 它必須在promise完成後調用,promise的value做爲第一個參數。
  • 2.2.2.2. 在promise完成以前不得調用它。
  • 2.2.2.3. 它不能被屢次調用。
2.2.3. 若是onRejected是一個函數:
  • 2.2.3.1. 它必須在promise被拒絕後被調用,promise的reason做爲第一個參數。
  • 2.2.3.2. promise拒絕以前不得調用它。
  • 2.2.3.3. 它不能被屢次調用。
2.2.4. onFulfilled或者onRejected執行上下文堆棧僅包含平臺代碼以前不得調用。(鏈式調用,then方法返回一個新的promise對象,須要等新promise對象實例化結束後才能調用then的回調函數) 3.1
2.2.5. onFulfilled而且onRejected必須做爲函數調用(即沒有this值)。 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(x多是promise,因此須要增長處理函數),運行Promise解決程序[[Resolve]](promise2, x)
  • 2.2.7.2.若是onFulfilled或者onRejected拋出異常e,將e做爲promise2rejected的reason。
  • 2.2.7.3.若是onFulfilled不是一個函數而且promise1已經完成,則promise2必須使用與promise1相同的value來fulfilled。
  • 2.2.7.4.若是onRejected不是一個函數而promise1被拒絕,promise2必須與promise1以一樣的reason來rejected。

2.3.Promise解決程序

promise解決程序是一個函數,參數爲一個promise和一個value,它表示爲[[Resolve]](promise,x)。若是x是一個thenable(promise),它會嘗試promise採用x的狀態,前提是x行爲至少有點像promise。不然,它做爲promise的fulfilled的value返回。測試

對thenables的這種處理容許promise實現進行互操做,只要它們公開Promise/A+兼容then方法便可。它還容許Promises/A+實現使用合理的then方法「同化」不一致的實現。this

要運行[[Resolve]](promise, x),請執行如下步驟:
2.3.1.若是promisex引用同一個對象,請以promise TypeError爲reason來rejected。
2.3.2. 若是xpromise,採用其狀態 3.4
  • 2.3.2.1. 若是x待處理pending,則promise必須保持待處理狀態,直到xfulfilled或rejected爲止。
  • 2.3.1.2. 若是/當 x fulfilled,則promise使用相同的value fulfilled。
  • 2.3.1.3. 若是/當 x rejected,請promise以一樣的reason rejected。
2.3.3.不然,若是x是對象或函數:
  • 2.3.3.1.讓then = x.then 3.5
  • 2.3.3.2.若是檢索屬性x.then中拋出的異常的結果e,將e做爲 promise的reason來rejected。
  • 2.3.3.3.若是then是函數,將x做爲this調用它,第一個參數resolvePromise和第二個參數rejectPromise,其中:
    • 2.3.3.3.1. 若是resolvePromise被調用並返回一個值y(原理同x,可能爲promise),則運行[[Resolve]](promise, y)
    • 2.3.3.3.2. 若是/當 rejectPromise被調用並是帶一個reasonr,將r做爲拒絕promise的reason。
    • 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做爲promise的rejected的reason。
  • 2.3.3.4.若是then不是一個函數,將x做爲promisefulfilled的value。
2.3.4. 若是x不是一個對象或函數,將x做爲promise的fulfilled的value。

若是使用參與循環可變鏈的thenable來解決promise,使得[[Resolve]](promise, thenable)最終致使[[Resolve]](promise,thenable)再次調用的遞歸性質,遵循上述算法將致使無限遞歸。鼓勵但不要求實現以檢測這種遞歸併拒絕promise提供信息TypeError做爲緣由。 3.6 es5

3.筆記

  • 3.1. 這裏的「平臺代碼」意味着引擎,環境和promise實現代碼。在實踐中,此要求確保在調用事件循環而且使用新堆棧以後異步執行onFulfilledonRejected執行then。這能夠用「宏任務」機制實現,例如setTimeout或者setImmediate,或者用「微任務」機制,例如MutationObserverprocess.nextTick。因爲promise實現被認爲是平臺代碼,所以它自己可能包含一個任務調度隊列或「trampoline」,其中調用處理程序。

  • 3.2.也就是說,嚴格模式thisundefined在其中;在草率模式下,它將成爲全局對象。

  • 3.3. promise2 === promise1只要實現知足全部要求,實現能夠容許。每一個實施應記錄它是否能夠生產promise2 === promise1以及在什麼條件下生產。

  • 3.4. 通常來講,x若是它來自當前的實現,那麼它只是一個真正的promise。該子句容許使用特定於實現的方法來採用已知符合的promise的狀態。

  • 3.5. 此過程首先存儲引用x.then,而後測試該引用,而後調用該引用,避免屢次訪問該x.then屬性。這些預防措施對於確保訪問者屬性的一致性很是重要,訪問者屬性的值可能會在檢索之間發生變化。

  • 3.6. 實現應不設置thenable鏈的深度任何限制,並假設超出任何限制遞歸將是無限的。只有真正的週期才能致使TypeError;若是遇到無限的不一樣的可能的鏈,那麼永遠遞歸就是正確的行爲。

相關文章
相關標籤/搜索