1. 程式人生 > 其它 >Promise原理解析與實現

Promise原理解析與實現

Promise原理解析與實現

知識要點

  • Promise 類
  • Promise 狀態
  • promise.resolve 方法實現
  • promise.reject 方法實現
  • promise.then 方法實現
  • promise.catch 方法實現

介紹

PromiseJavaScript 非同步程式設計的一種流行解決方案,使用原生手寫方式一步一步的帶你實現 Promise

Promise 類

Promise 的建構函式必須接收一個函式引數(也就是需要執行非同步任務的函式),該函式將在傳入以後立即呼叫,並傳入 Promise 物件下的兩個方法 resolvereject

Promise 狀態

每一個 Promise 物件都存在以下三種狀態:

  • PENDING : 進行中,Promise 物件的初始狀態
  • FULFILLED : 已成功
  • REJECTED : 已失敗

每一個 Promise 物件只能由 PENDING 狀態變成 FULFILLEDREJECTED,且狀態發生變化以後就能再改變了
一個 Promise 物件狀態的變化由傳入的非同步任務完成情況來決定的,Promise 提供了兩個用來改變狀態的方法

promise.#resolve 方法

Promise 物件的狀態從 PENDING 變為 FULFILLED,並執行成功後的註冊任務

注意:如果當前狀態已經改變過了,則直接 return

promise.#reject 方法

Promise 物件的狀態從 PENDING 變為 REJECTED,並執行失敗後的註冊任務

注意:如果當前狀態已經改變過了,則直接 return

promise.then 方法

接收兩個函式作為引數,根據當前 Promise 的狀態來做不同的處理

  • PENDING : 新增到對應的任務佇列
  • FULFILLED / REJECTED : 不用新增到佇列,而是立即執行任務
    then(resolve)簡寫

返回值

then 方法在執行最後必須返回一個新的 Promise 物件

簡而言之:把新返回的 Promise 物件的 resolvereject

then 中執行的 fulfilledHandlerrejectedHandler 新增到一個任務佇列中執行,這樣才能使用原有的 then 執行完成以後才執行新的 Promise 中的 then
當一個[Promise]

  • 如果then中的回撥函式沒有返回值,那麼then返回的Promise將會成為接受狀態,並且該接受狀態的回撥函式的引數值為 undefined。
  • 如果then中的回撥函式返回一個值,那麼then返回的Promise將會成為接受狀態,並且將返回的值作為接受狀態的回撥函式的引數值。
  • 如果then中的回撥函式丟擲一個錯誤,那麼then返回的Promise將會成為拒絕狀態,並且將丟擲的錯誤作為拒絕狀態的回撥函式的引數值。
  • 如果then中的回撥函式返回一個已經是接受狀態的Promise,那麼then返回的Promise也會成為接受狀態,並且將那個Promise的接受狀態的回撥函式的引數值作為該被返回的Promise的接受狀態回撥函式的引數值。
  • 如果then中的回撥函式返回一個已經是拒絕狀態的Promise,那麼then返回的Promise也會成為拒絕狀態,並且將那個Promise的拒絕狀態的回撥函式的引數值作為該被返回的Promise的拒絕狀態回撥函式的引數值。
  • 如果then中的回撥函式返回一個未定狀態(pending)的Promise,那麼then返回Promise的狀態也是未定的,並且它的終態與那個Promise的終態相同;同時,它變為終態時呼叫的回撥函式引數與那個Promise變為終態時的回撥函式的引數是相同的。

promise.catch 方法

promise.finally 方法

ECMA2018 Added

Promise.resolve 方法

Promise.reject 方法

Promise.all 方法

//不需要reject
(resolve)=>{

}

Promise.race 方法