2025-02-17-非同步程式的執行順序

2025-02-17-非同步程式的執行順序

這個核心觀念,其實關係到 非同步程式的執行順序 ——也就是「事情不是馬上完成,要等做完再做下一件」,這正是 callback、async/await 要解決的問題。


🎯 你的問題:「為什麼不是從裡到外 call?」

你可能想像的是這樣寫:

1
2
3
4
5
6
7
8
9
10
11
12
13
完成(() => {
送人(() => {
包裝(() => {
切蛋糕(() => {
烘烤(() => {
攪拌(() => {
買材料()
})
})
})
})
})
})

這樣是「先寫最後一步,從裡面往外包」,但這樣其實會 先執行最外層,也就是「完成()」,但那時前面步驟根本還沒做!


💡 原因:JavaScript 的非同步邏輯是「事件驅動」

JavaScript 不會等事情做完才繼續跑下一行,它會先繼續往下跑,等到某個動作完成後,再「呼叫 callback」。

所以程式碼的寫法要跟「事情發生的順序」一樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
買材料(() => {
攪拌(() => {
烘烤(() => {
切蛋糕(() => {
包裝(() => {
送人(() => {
完成()
})
})
})
})
})
})

因為你得 先做完前面,才會進行下一步


🧁 用生活比喻更好懂

假設你是蛋糕助手:

  1. 你先去買材料,買完了你就打電話通知「下一個人」。
  2. 「下一個人」接到電話後,開始攪拌,完了又通知「下一個人」。
  3. 然後才烤、切、包裝……

如果你一開始就打電話給「送蛋糕的人」,他會說:

❗️「欸我等你們做完蛋糕再通知我啦,我現在不能開始啦!」


✅ 總結

  • callback 是照「完成順序」來寫的。
  • 從外到內是因為「前面的事做完,才通知後面可以做」。
  • 如果你寫從裡到外,會導致「還沒開始就想完成」,邏輯上不通。