PromiseA+規範

土豆不是瓜 2021-09-18 13:14:31 阅读数:660

promisea+ promisea

PromiseA+ 規範

術語

  1. promise是一個有then方法的對象或者函數,行為遵循PromiseA+規範
  2. thenable是一個有then方法的對象或者函數
  3. value是Promise狀態成功時的值,也是resolve的參數,包括各種數據類型, undefined / string / number / boolean / promise ...
  4. reason是Promise狀態失敗時的值,也就是reject的參數,錶示拒絕的原因
  5. exception throw 拋出去的异常

規範

Promise States

promise有三種狀態,要注意他們之間的關系

  1. pending
    1.1 初始狀態,可以改變
    1.2 一個promise在被resolve或者reject之前,都處於這個狀態
    1.3 通過 resolve -> fulfilled
    1.4 通過 reject -> rejected
  2. fulfilled
    2.1 最終態,不可以改變
    2.2 一個promise在被resolve之後變成這個狀態
    2.3 必須有一個value值 // undefined
  3. rejected
    3.1 最終態,不可以改變
    3.2 一個promise在被reject之後變成這個狀態
    2.3 必須有一個reason值 // undefined

pending -> resolve(value) -> fulfilled
pending -> reject(reason) -> rejected

then

promise應該提出一個then方法,用來訪問最終的結果,無論是value還是reason。

 promsie.resolve(onfulfilled, onrejected);
  1. 參數要求
    1.1 onfulfilled 必須是函數類型,如果不是函數,應該被忽略
    1.2 onrejected 必須是函數類型,如果不是函數,應該被忽略
  2. onfulfilled特性
    2.1 在 promise 變成 fulfilled 後,應該調用 onfulfilled,參數是value
    2.2 在 promise 變成 fulfilled 前,不應該被調用
    2.3 只能被執行一次
  3. onrejected特性
    3.1 在 promise 變成 rejected 後,應該調用 onrejected,參數是reason
    3.2 在 promise 變成 rejected 前,不應該被調用
    3.3 只能被執行一次
  4. onfulfilled 和 onrejected 應該是微任務
    queueMicrotask 實現微任務的調用
  5. then方法可以被調用多次
    5.1 promise 變成 fulfilled 後,所有 onfulfilled 回調都應該按照then的順序執行

     在實現promsie的時候,咱們需要一個數組來存儲 onfulfilled的cb
     promise.then(cb1).then(cb2).then(cb3)...
    // or
    const promise = new Promsie();
    promise.then(cb1);
    promise.then(cb2);
    // 

    5.2 promise 變成 rejected 後,所有 onrejected 回調都應該按照then的順序執行

     在實現promsie的時候,咱們需要一個數組來存儲 onrejected的cb
  6. 返回值
    then的返回值是一個promise,新的? 舊的?

     promsie2 = promise1.then(onfulfilled, onrejected)

    6.1 onfulfilled 和 onrejected 執行的結果為 x,調用 resolvePromise
    6.2 onfulfilled 和 onrejected 執行的异常,promsie2需要被rejected
    6.3 如果onfulfilled不是一個函數,promsie2 以 promise1的value 觸發 fulfilled
    6.4 如果onrejected不是一個函數,promsie2 以 promise1的reason 觸發 rejected

  7. resolvePromise

     resolvePromsie(promise2, x, resolve, reject);

    7.1 如果promise2 和 x 相等,那麼reject typeError 會死造成死循環,為什麼 ???
    7.2 如果x 是 promise

     如果x 是 pending,promise的狀態必須也是等待/pending,知道x 變成了 fulfilled / rejected
    如果x 是 fulfilled,fulfilled promise width the same value 值的透傳
    如果x 是 rejected,reject promise width the same reason 

    7.3 如果x 是一個object 或者是一個 function

     let then = x.then;
    如果x.then 這一步出錯了, try catch(e), reject(e) **如果是一個object 怎麼可能會出錯 ???**
    如果then是一個函數, then.call(x, resolvePromsieFn, rejectedPromiseFn);
    resolvePromsieFn 入參 y,執行resolvePromsie(promise2, y, resolve, reject);
    如果調用then的時候拋出了异常e,reject reason
版权声明:本文为[土豆不是瓜]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918131431439h.html