## Promise.all 實作 `Promise.all` 是一個用於並行處理多個 Promise 的方法,它會在所有傳入的 Promise 都完成(resolved)後,回傳一個包含所有結果的 Promise。 如果其中任何一個 Promise 失敗(rejected),`Promise.all` 也會立即失敗並返回那個單獨錯誤。 poo-poo code ```javascript= function customPromiseAll(promises) { return new Promise((resolve, reject) => { let results = []; let promisesLength = 0; promises.forEach((promise, index) => { Promise.resolve(promise) .then(result => { results[index] = result; promisesLength += 1; if (promisesLength === promises.length) { resolve(results); } }) .catch(error => { reject(error); }); }); }); } const p1 = Promise.resolve(1); const p2 = Promise.resolve(2); const p3 = Promise.resolve(3); customPromiseAll([p1, p2, p3]) .then(results => { console.log(results); // [1, 2, 3] }) .catch(error => { console.error(error); }); ``` ## 總結 > 所以相比`Promise.race`,`Promise.all`只是在race原有邏輯上多了個index紀錄把結果塞入Array中,最後當Array長度與來源一致時,輸出去 1. results 陣列用於儲存每個 Promise 的結果。 1. promisesLength 用來追蹤已完成的 Promise 數量。 1. 每個 Promise 被解析後,其結果會儲存到 results 陣列中相應的位置。 1. 當所有 Promise 都完成時,resolve 返回結果陣列。 1. 如果任何一個 Promise 被拒絕,reject 會立即中斷返回那個錯誤。 1. 這就是 Promise.all 的基本實作,可以用來處理多個異步操作並在所有操作完成後獲取結果。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up