2025-02-20-非同步要同時處理很多事情

2025-02-20-非同步要同時處理很多事情

當我們想 同時執行多個非同步任務(例如:同時叫三個 API、同時讀三個檔案),就不能一個接一個 await,那會浪費時間。


✅ 解法一:Promise.all(平行處理)

Promise.all() 可以讓多個非同步任務「同時執行」,然後等它們都完成後再處理結果。


🎯 情境範例:同時叫三個 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function fetchA() {
return new Promise((resolve) => {
setTimeout(() => resolve('📦 A 完成'), 1000)
})
}

function fetchB() {
return new Promise((resolve) => {
setTimeout(() => resolve('📦 B 完成'), 1500)
})
}

function fetchC() {
return new Promise((resolve) => {
setTimeout(() => resolve('📦 C 完成'), 500)
})
}

async function fetchAll() {
console.log('開始同時處理 A、B、C...')

const results = await Promise.all([fetchA(), fetchB(), fetchC()])

console.log('✅ 全部完成:', results)
}

fetchAll()

🧾 執行結果:

1
2
開始同時處理 A、B、C...
✅ 全部完成: [ '📦 A 完成', '📦 B 完成', '📦 C 完成' ]

🧠 關鍵點:

  • 三個請求同時進行,不會等彼此完成才開始。
  • 最長的那個(B:1.5秒)決定了總耗時。

✅ 解法二:Promise.race(誰快就用誰)

1
2
3
4
Promise.race([fetchA(), fetchB(), fetchC()])
.then((fastest) => {
console.log('🏁 最快的是:', fastest)
})
  • 誰最先完成,結果就來自誰。
  • 適合用在「先回應就先顯示」的場景,比如多個備援伺服器。

✅ 解法三:不等結果,讓它們自己完成

如果你不在乎結果的順序,只想「觸發」多個動作,但不需要等它們完成,也可以這樣:

1
2
3
4
fetchA()
fetchB()
fetchC()
console.log('我不等你們,我先做自己的事')

🧠 小結:

方法 用途
await A(); await B() 依序等待,每個做完才做下一個(慢)
Promise.all([A, B]) 同時處理多件事,全部都完成才繼續
Promise.race([A, B]) 同時處理,誰快用誰
不 await 只觸發,不等結果