【JavaScript 筆記】 這是你要的承諾 Promise

Chengcheng Hsu
4 min readMar 20, 2022

--

Photo by Joanna Nix-Walkup on Unsplash

改自十三周的學習筆記,還記得那時候原本開開心心要交作業,但看完自我檢討時發現 Huli 早就知道你會踩到你這個學習的坑,心裡的 OS 是:「幹,對呀,其實我根本就不懂什麼是 promise」,所以此篇想重新複習一下 Promise 到底是什麼東西、如何建立 Promise 、以及它怎麼處理

先看一下 MDN Web Docs 怎麼解釋 Promise 的

The Promise object represents the eventual completion (or failure) of an asynchronous operation and its resulting value.

第一個,它是一個建構式函式,屬 Promise 物件 (如 RegExp Object、JQuery Object 一樣),第二個解釋它是一個非同步操作下最終完成或失敗的結果,會回傳完成或失敗的「值」(這個解釋非常的官方,不易懂)

但我們如果從字面上來看,Promise 中文來說就是「承諾」,當你對一個人給予一個承諾,在往後的時間內你不是兌現承諾,就是打破承諾,其各有各的後果,互不干涉,也就是上面所說的「值」。

Promise 有三種狀態:

  1. pending:承諾還未被實現,未完待續的意思
  2. fulfilled:承諾被兌現,其預期的結果是什麼,Promise 的參數為 resolve (待會會解釋)
  3. rejected:承諾被打破,其預期的結果是什麼,Promise 的參數為 reject (待會會解釋)

例如有個故事像是這樣:

今天如果有個女生對一個男生的說「明天五點我會出現和你個吃飯」,這個 Promise 就已經建立,因此從說這句話到明天五點即為「pending」,明天五點一到,女生出現即「fulfilled」,結果是男生很開心,沒出現或超過五點即「rejected」,結果是男生會不爽,因為嚴格來說承諾被打破了

來製作 Promise 物件

以剛剛的故事來嘗試建立一個 Promise 物件,首先我們建立一個 result 的函式,並且在裡面宣告 promise 物件 promiseForMan,此物件有 resolve 和 reject 兩個參數,皆為函式,代表著當這個 promise 承諾被兌現時執行 resolve,回傳預設的值,不被兌現時執行 reject,回傳預設的值,接著在 promise 裡面做一個簡單的 isShow 判斷,也就是女生是否出現,然後我們把這個 promise 物件回傳,所以當 result 函式被執行時,它就會接收到 promiseForMan 這個 promise 物件,依據 isShow 做 promise 是否兌現的判斷

Promise chain

接著我們執行 result 並傳入 true,這時 result 就會接收到 promiseForMan 這個 promise 物件,然後需要用 .then() 來做串聯,並使用 .catch() 來處理當 promise reject 時所印出的錯誤,這些的意思是當非同步行為完成後要做的動作,裡面都是傳入你想做什麼事情的函式,因為傳入的 result 的是true,因此 Promise 會執行 resolve,兌現承諾,結果會是 The man is happy ,反之如果傳入的是 false ,會被我們寫的 .catch() 抓到,結果會是 The man is unhappy QQ

然而有很多時候會看到 一個 .then() 串 一個 .then() ,這就是 promise chain,另外.then() 的這種串連方式能讓我們避免 Callback Hell 回呼地獄,這也是我們為什麼要用 Promise 的其中一個原因,這些 .then()傳入的函式你也能去呼叫其他非同步的事情,也能接收 Promise,並一直執行下去,就好像一個 Promise 承諾被兌現完後又開啟另外一個 Promise 承諾,我想這篇是我第一次嘗試來解釋 Promise ,並用故事來做包裝,中間若有錯誤歡迎指證,當然 Promise 還有很多可以講,例如 catch error 到底是在抓什麼錯誤,因此還有很多事情可以延伸,不過這週就先這樣 (゚3゚)~♪

參考資料:

Mdn web docs <promise>

JavaScript — Promise (2)

--

--

Chengcheng Hsu
Chengcheng Hsu

Written by Chengcheng Hsu

Movie, Travel and Story | Software developer | contact me: ychsu.wk@gmail.com

No responses yet