Promise原理解析與實現
阿新 • • 發佈:2021-11-09
Promise原理解析與實現
知識要點
- Promise 類
- Promise 狀態
- promise.resolve 方法實現
- promise.reject 方法實現
- promise.then 方法實現
- promise.catch 方法實現
介紹
Promise
是 JavaScript
非同步程式設計的一種流行解決方案,使用原生手寫方式一步一步的帶你實現 Promise
庫
Promise 類
Promise
的建構函式必須接收一個函式引數(也就是需要執行非同步任務的函式),該函式將在傳入以後立即呼叫,並傳入 Promise
物件下的兩個方法 resolve
和 reject
Promise 狀態
每一個 Promise
物件都存在以下三種狀態:
- PENDING : 進行中,
Promise
物件的初始狀態 - FULFILLED : 已成功
- REJECTED : 已失敗
每一個
Promise
物件只能由PENDING
狀態變成FULFILLED
或REJECTED
,且狀態發生變化以後就能再改變了
一個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
物件的resolve
和reject
與then
中執行的fulfilledHandler
和rejectedHandler
新增到一個任務佇列中執行,這樣才能使用原有的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)=>{
}