Promise/A+規範

Promise表示一個異步操做的最終結果。與Promise最主要的交互方法是經過將函數傳入它的then方法從而獲取得Promise最終的值或Promise最終最拒絕(reject)的緣由。git

1. 術語

promise是一個包含了兼容promise規範then方法的對象或函數,
thenable 是一個包含了then方法的對象或函數。
value 是任何Javascript值。 (包括 undefined, thenable, promise等).
exception 是由throw表達式拋出來的值。
reason 是一個用於描述Promise被拒絕緣由的值。github

2. 要求

2.1 Promise狀態

一個Promise必須處在其中之一的狀態:pending, fulfilled 或 rejected.promise

  • 若是是pending狀態,則promise:

    • 能夠轉換到fulfilled或rejected狀態。
  • 若是是fulfilled狀態,則promise:

    • 不能轉換成任何其它狀態。
    • 必須有一個值,且這個值不能被改變。
  • 若是是rejected狀態,則promise能夠:

    • 不能轉換成任何其它狀態。
    • 必須有一個緣由,且這個值不能被改變。

」值不能被改變」指的是其identity不能被改變,而不是指其成員內容不能被改變。異步

2.2 then 方法

一個Promise必須提供一個then方法來獲取其值或緣由。
Promise的then方法接受兩個參數:ide

jspromise.then(onFulfilled, onRejected)
  1. onFulfilledonRejected 都是可選參數:

    1. 若是onFulfilled不是一個函數,則忽略之。
    2. 若是onRejected不是一個函數,則忽略之。
  2. 若是onFulfilled是一個函數:

    1. 它必須在promise fulfilled後調用, 且promise的value爲其第一個參數。
    2. 它不能在promise fulfilled前調用。
    3. 不能被屢次調用。
  3. 若是onRejected是一個函數,

    1. 它必須在promise rejected後調用, 且promise的reason爲其第一個參數。
    2. 它不能在promise rejected前調用。
    3. 不能被屢次調用。
  4. onFulfilledonRejected 只容許在 execution context 棧僅包含平臺代碼時運行. [3.1].
  5. onFulfilledonRejected 必須被當作函數調用 (i.e. 即函數體內的 thisundefined). [3.2]
  6. 對於一個promise,它的then方法能夠調用屢次.

    1. promise fulfilled後,全部onFulfilled都必須按照其註冊順序執行。
    2. promise rejected後,全部OnRejected都必須按照其註冊順序執行。
  7. then 必須返回一個promise [3.3].函數

    jspromise2 = promise1.then(onFulfilled, onRejected);
    1. 若是onFulfilledonRejected 返回了值x, 則執行Promise 解析流程[[Resolve]](promise2, x).
    2. 若是onFulfilledonRejected拋出了異常e, 則promise2應當以ereason被拒絕。
    3. 若是 onFulfilled 不是一個函數且promise1已經fulfilled,則promise2必須以promise1的值fulfilled.
    4. 若是 OnReject 不是一個函數且promise1已經rejected, 則promise2必須以相同的reason被拒絕.

2.3 Promise解析過程

Promise解析過程 是以一個promise和一個值作爲參數的抽象過程,可表示爲[[Resolve]](promise, x). 過程以下;測試

  1. 若是promisex 指向相同的值, 使用 TypeError作爲緣由將promise拒絕。
  2. 若是 x 是一個promise, 採用其狀態 [3.4]:

    1. 若是x是pending狀態,promise必須保持pending走到x fulfilled或rejected.
    2. 若是x是fulfilled狀態,將x的值用於fulfill promise.
    3. 若是x是rejected狀態, 將x的緣由用於reject promise..
  3. 若是x是一個對象或一個函數:

    1. then 賦爲 x.then. [3.5]
    2. 若是在取x.then值時拋出了異常,則以這個異常作爲緣由將promise拒絕。
    3. 若是 then 是一個函數, 以xthis調用then函數, 且第一個參數是resolvePromise,第二個參數是rejectPromise,且:

      1. resolvePromise 被以 y爲參數調用, 執行 [[Resolve]](promise, y).
      2. rejectPromise 被以 r 爲參數調用, 則以r爲緣由將promise拒絕。
      3. 若是 resolvePromiserejectPromise 都被調用了,或者被調用了屢次,則只第一次有效,後面的忽略。
      4. 若是在調用then時拋出了異常,則:

        1. 若是 resolvePromiserejectPromise 已經被調用了,則忽略它。
        2. 不然, 以e爲reason將 promise 拒絕。
    4. 若是 then不是一個函數,則 以x爲值fulfill promise
  4. 若是 x 不是對象也不是函數,則以x爲值 fulfill promise

補充

英文原文地址:http://promisesaplus.com
若要了解文中每一條規則,則參閱其測試倉庫:https://github.com/promises-aplus/promises-tests/tree/master/lib/teststhis

相關文章
相關標籤/搜索