想象一下,你是一位頂級歌手,粉絲們日夜詢問你即将到來的歌曲。
您承諾在它出版時将其發送給這些粉絲。歌手給粉絲提供一份名單。他們可以填寫他們的電子郵件位址,這樣當歌曲可用時,所有訂閱方都會立即收到它。即使出現了非常大的問題,比如工作室發生火災,導緻歌曲無法釋出,他們仍然會收到通知。
這就是我們在程式設計中經常遇到的事情的現實類比。
做某事并需要時間的“生産代碼”。例如,一些通過網絡加載資料的代碼。這就是“歌手”。
一個“消費代碼”,期望消費“生産代碼”産生的結果。許多函數可能需要該結果。這些是“粉絲”。
Promise 是一個特殊的 JavaScript 對象,
它将生産代碼和消費代碼連結在一起
。根據我們的類比:這是“訂閱清單”。 “生産代碼”花費它需要的任何時間來産生承諾的結果,并且“承諾”使該結果在準備好時可供所有訂閱的代碼使用。
let promise = new Promise(function(resolve, reject) {
// executor (the producing code, "singer")
});
傳遞給 new Promise 的函數稱為
執行器
。 當新的 Promise 被建立時,
executor 會自動運作
。 它包含最終應該産生結果的生産代碼。 按照上面的類比:執行者是“歌手”。
它的參數 resolve 和 reject 是 JavaScript 本身提供的回調。 這是兩個原生對象。
我們的代碼隻在執行器内部。
當 executor 獲得結果時,無論是早是晚,都沒有關系,它應該調用以下回調之一:
- resolve(value) — 如果作業成功完成,帶有結果值。
- reject(error) — 如果發生錯誤,error 是錯誤對象。
- state — 最初是“pending”,然後在調用 resolve 時更改為“fulfilled”,或者在調用 reject 時更改為“rejected”。
- 結果 - 最初未定義,然後在調用 resolve(value) 時更改為 value,或者在調用 reject(error) 時更改為錯誤。