【字節(jié)】如何實(shí)現(xiàn)一個(gè) Promise.all

(? Paparwin Tanupatarachai/Getty Images)
大家好,我是山月,為大家進(jìn)大廠而操碎了心的小編。本文收錄于 GitHub 日問: DailyQuestion[1],每天學(xué)習(xí)五分鐘,一年進(jìn)入大廠中。可在右下角打開原文查看
有一次頭條面試,一道手寫題目是:如何手寫實(shí)現(xiàn) promise.all。
我從來沒有想過要手寫實(shí)現(xiàn) promise.all 函數(shù),稍微一想,大概就是維護(hù)一個(gè)數(shù)組,把所有 promise 給 resolve 了之后都扔進(jìn)去,這有啥子好問的。沒想到,一上手還稍微有點(diǎn)棘手。
先來看一個(gè)示例吧:
await Promise.all([1, Promise.resolve(2)])
//-> [1, 2]
await Promise.all([1, Promise.reject(2)])
//-> Throw Error: 2
傳入一個(gè)數(shù)組,可包含 Promise,也可包含普通數(shù)據(jù) 數(shù)組中 Prmise 并行執(zhí)行 但凡有一個(gè) Promise 被 Reject 掉,Promise.all 失敗
function pAll (promises) {
return new Promise((resolve, reject) => {
// 結(jié)果用一個(gè)數(shù)組維護(hù)
const r = []
const len = promises.length
let count = 0
for (let i = 0; i < len; i++) {
// Promise.resolve 確保把所有數(shù)據(jù)都轉(zhuǎn)化為 Promise
Promise.resolve(promises[i]).then(o => {
// 因?yàn)?nbsp;promise 是異步的,保持?jǐn)?shù)組一一對(duì)應(yīng)
r[i] = o;
// 如果數(shù)組中所有 promise 都完成,則返回結(jié)果數(shù)組
if (++count === len) {
resolve(r)
}
// 當(dāng)發(fā)生異常時(shí),直接 reject
}).catch(e => reject(e))
}
})
}
為了測(cè)試,實(shí)現(xiàn)一個(gè) sleep 函數(shù)
const sleep = (seconds) => new Promise(resolve => setTimeout(() => resolve(seconds), seconds))
以下示例進(jìn)行測(cè)試,沒有問題
pAll([1, 2, 3]).then(o => console.log(o))
pAll([
sleep(3000),
sleep(2000),
sleep(1000)
]).then(o => console.log(o))
pAll([
sleep(3000),
sleep(2000),
sleep(1000),
Promise.reject(10000)
]).then(o => console.log(o)).catch(e => console.log(e, '<- Error'))
更多面試
【字節(jié)】如何實(shí)現(xiàn)選中復(fù)制的功能
評(píng)論
圖片
表情
