[筆記] 認識同步與非同步 — Callback + Promise + Async/Await

Mike Huang
麥克的半路出家筆記
16 min readJul 14, 2019

--

最近嘗試在 Node.js 上串接第三方 API,遇到了同步與非同步的議題,想說可以來做個筆記 — 以下將介紹同步與非同步概念,並透過買咖啡的舉例和專案實作範例來介紹處理非同步事件的 Callback、Promise,和 ECMAScript 2017 (ES8) 推出的 Async/Await 語法。

非同步 Asynchronous

想像你去咖啡店買拿鐵和黑咖啡,你會發現可能的情況是:

  1. 你點了杯拿鐵和黑咖啡
  2. 店員在收銀機上輸入你的點餐內容
  3. 店員請 A 同事準備拿鐵、B 同事準備黑咖啡,並告知做完後,提醒他
  4. 黑咖啡製作的比較快,B 同事先完成,而剛好店員幫你結完帳沒事,所以把黑咖啡拿給你
  5. 拿鐵製作包含較多步驟,花費比較多時間,等 A 同事完成後,店員剛好沒事,所以把拿鐵也遞給你

櫃檯店員本人一次只能做一件事情,但為了節省時間,店員將工作分配給其他同事,在下完指令後,店員就可以繼續幫你結帳和集點等,待結完帳,等同事們各自完成製作並告知後,店員依序把飲料交給你 — 最終等待時間減少,也不會浪費閒置的資源 — 這就是現實生活中非同步的情形

同步 Synchronous

妳同樣點了拿鐵和黑咖啡,換成同步的概念:

  1. 店員在收銀機上輸入你的點餐內容
  2. 店員請 A 同事開始準備拿鐵
  3. A 同事準備好拿鐵,店員轉交給你
  4. 店員請 B 同事開始準備黑咖啡
  5. B 同事準備好黑咖啡,店員交給你
  6. 店員幫你刷載具、打統編、收錢、找錢、蓋集點章

同樣的餐點內容,若為同步處理,代表者這件事情做完,再做下一步。也就是說,A 完成拿鐵後,店員才請 B 準備黑咖啡、咖啡都做好了,櫃檯店員才能繼續幫你結帳。相對非同步來說,時間花費較多,也浪費了不少閒置資源。

認識運作方式和常見的專有名詞

從咖啡店的例子可以發現:

  1. 櫃檯店員手上一次就只能做一件事情(Single thread 單執行緒),只是在非同步的例子中,將製作咖啡的事情委派給其他同事處理,讓自己可以繼續幫你結帳,來提高效率 — JavaScript 是 Single…

--

--

Mike Huang
麥克的半路出家筆記

熱愛接觸和學習網頁開發相關技術與知識、喜歡分享、旅遊和咖啡的軟體工程師 A software engineer who enjoy learning and sharing web technologies & fancy coffee and travelling