Promise(1):Promise/A+規範

與Promise最主要的交互方法是經過將函數傳入它的then方法從而獲取得Promise最終的值或Promise最終最拒絕(reject)的緣由git

術語

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

要求

2.1 Promise狀態

一個Promise必須處在其中之一的狀態:pending、fulfilled 或 rejectedgithub

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

「值不能被改變」指的是其identity不能被改變,而不是指其成員內容不能被改變segmentfault

2.2 then方法

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

jspromise.then(onFulfilled, onRejected)
複製代碼
  1. onFulfilledonRejected 都是可選參數:
    1. 若是onFulfilled不是一個函數,則忽略之。
    2. 若是onRejected不是一個函數,則忽略之。
  2. 若是onFulfilled是一個函數:
    1. 它必須在promise fulfilled後調用,且promisevalue爲其第一個參數
    2. 它不能在promise fulfilled前調用
    3. 不能被屢次調用
  3. 若是onRejected是一個函數
    1. 它必須在promise rejected後調用,且promisereason爲其第一個參數
    2. 它不能在promise rejected前調用
    3. 不能被屢次調用
  4. onFulfilledonRejected 只容許在 execution context 棧僅包含平臺代碼時運行
  5. onFulfilledonRejected 必須被當作函數調用 (i.e. 即函數體內的 thisundefined)
  6. 對於一個promise,它的then方法能夠調用屢次
    1. promise fulfilled後,全部onFulfilled都必須按照其註冊順序執行
    2. promise rejected後,全部OnRejected都必須按照其註冊順序執行
  7. then 必須返回一個promise [3.3]
    1. 若是onFulfilledonRejected 返回了值x, 則執行Promise 解析流程[[Resolve]](promise2, x)
    2. 若是onFulfilledonRejected拋出了異常e, 則promise2應當以e爲reason被拒絕。
    3. 若是 onFulfilled 不是一個函數且promise1已經fulfilled,則promise2必須以promise1的值fulfilled.
    4. 若是 OnReject 不是一個函數且promise1已經rejected, 則promise2必須以相同的reason被拒絕.
jspromise2 = promise1.then(onFulfilled, onRejected);
複製代碼

2.3 Promise解析過程

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

  1. 若是promise 和 x 指向相同的值, 使用 TypeError作爲緣由將promise拒絕。jsp

  2. 若是 x 是一個promise, 採用其狀態 [3.4]ide

    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 是一個函數, 以x爲this調用then函數, 且第一個參數是resolvePromise,第二個參數是rejectPromise,且:
      1. 當 resolvePromise 被以 y爲參數調用, 執行 [[Resolve]](promise, y).
      2. 當 rejectPromise 被以 r 爲參數調用, 則以r爲緣由將promise拒絕。
      3. 若是 resolvePromise 和 rejectPromise 都被調用了,或者被調用了屢次,則只第一次有效,後面的忽略。
      4. 若是在調用then時拋出了異常,則
        1. 若是 resolvePromise 或 rejectPromise 已經被調用了,則忽略它
        2. 不然, 以e爲reason將 promise 拒絕
  4. 若是 x 不是對象也不是函數,則以x爲值 fulfill promise。測試

參考連接

深刻理解 Promise (上)this

Promise/A+規範中文

Promise/A+規範英文

測試倉庫

相關文章
相關標籤/搜索