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 |
只觸發,不等結果 |