天天看點

通過現實生活中一個例子來了解 JavaScript Promise

想象一下,你是一位頂級歌手,粉絲們日夜詢問你即将到來的歌曲。

您承諾在它出版時将其發送給這些粉絲。歌手給粉絲提供一份名單。他們可以填寫他們的電子郵件位址,這樣當歌曲可用時,所有訂閱方都會立即收到它。即使出現了非常大的問題,比如工作室發生火災,導緻歌曲無法釋出,他們仍然會收到通知。

這就是我們在程式設計中經常遇到的事情的現實類比。

做某事并需要時間的“生産代碼”。例如,一些通過網絡加載資料的代碼。這就是“歌手”。

一個“消費代碼”,期望消費“生産代碼”産生的結果。許多函數可能需要該結果。這些是“粉絲”。

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) 時更改為錯誤。

繼續閱讀