Promise.all Implementation
Implement a Custom Promise.all Function
Implement Promise.all
難度:Medium
題目描述
實作一個Promise.all
函數,接受一個陣列作為輸入(通常是 Promise),並返回一個新的 Promise,該 Promise 解析為一個包含所有輸入 Promise 結果的陣列。- 當所有輸入的 Promise 都解析完成時,返回的 Promise 才會解析
- 如果輸入陣列為空,則返回一個解析為空陣列的 Promise
- 如果任何一個輸入的 Promise 被拒絕,則立即拒絕並返回第一個拒絕的原因
- 需要處理非 Promise 的輸入值
核心要求
- 保持順序
- 返回的陣列必須與輸入陣列的順序相同
- 即使後面的 Promise 先完成,也要等待前面的 Promise
- 錯誤處理
- 任一 Promise 被拒絕時立即返回錯誤
- 不需等待其他 Promise 完成
- 型別安全
- 正確處理泛型型別
- 支援混合型別的輸入(Promise 和非 Promise)
使用範例
Promise
Async
TypeScript
解題思路
1. 理解 Promise.all 的特性
- 返回值特性
- 返回一個新的 Promise
- 該 Promise 解析為一個陣列
- 陣列中的值與輸入順序相對應
- 執行特性
- 並行執行所有 Promise
- 等待所有 Promise 完成
- 任一 Promise 失敗則立即返回錯誤
- 輸入處理
- 支援 Promise 和非 Promise 混合輸入
- 空陣列返回空陣列的 Promise
- 保持輸入順序
2. 實作方案
方案一:使用 async/await
方案二:使用 Promise.then()
3. 實作細節解析
- Promise 建構
- 返回新的 Promise
- 使用 resolve 和 reject 控制狀態
- 結果管理
- 使用 try/catch 捕獲錯誤
- 立即拒絕整個 Promise
進階主題
1. 效能優化版本
2. 實際應用場景
- 並行 API 請求
- 資源預加載
3. 測試案例
常見陷阱
- 順序處理
- 需要確保結果陣列與輸入順序相同
- 不能依賴 Promise 完成的順序
- 型別處理
- 需要正確處理非 Promise 值
- 使用 Promise.resolve 統一處理
- 記憶體管理
- 大量 Promise 時的記憶體使用
- 適時清理中間狀態
面試重點
- 核心概念
- Promise 的運作機制
- 非同步程式設計模式
- 錯誤處理策略
- 延伸問題
- 如何實現 Promise.race?
- 如何實現 Promise.allSettled?
- 如何處理超時機制?