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

        共 2545字,需瀏覽 6分鐘

         ·

        2021-03-31 09:46

        搖籃山-圣克萊爾湖國家公園,澳大利亞塔斯馬尼亞州
        (? Paparwin Tanupatarachai/Getty Images)

        大家好,我是山月,為大家進(jìn)大廠而操碎了心的小編。本文收錄于 GitHub 日問: DailyQuestion[1],每天學(xué)習(xí)五分鐘,一年進(jìn)入大廠中??稍谟蚁陆谴蜷_原文查看

        有一次頭條面試,一道手寫題目是:如何手寫實現(xiàn) promise.all。

        我從來沒有想過要手寫實現(xiàn) promise.all 函數(shù),稍微一想,大概就是維護(hù)一個數(shù)組,把所有 promise 給 resolve 了之后都扔進(jìn)去,這有啥子好問的。沒想到,一上手還稍微有點棘手。

        先來看一個示例吧:

        await Promise.all([1Promise.resolve(2)])
        //-> [1, 2]

        await Promise.all([1Promise.reject(2)])
        //-> Throw Error: 2
        1. 傳入一個數(shù)組,可包含 Promise,也可包含普通數(shù)據(jù)
        2. 數(shù)組中 Prmise 并行執(zhí)行
        3. 但凡有一個 Promise 被 Reject 掉,Promise.all 失敗
        function pAll (promises{
          return new Promise((resolve, reject) => {
            // 結(jié)果用一個數(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 => {
                // 因為 promise 是異步的,保持?jǐn)?shù)組一一對應(yīng)
                r[i] = o;

                // 如果數(shù)組中所有 promise 都完成,則返回結(jié)果數(shù)組
                if (++count === len) {
                  resolve(r)
                }
                // 當(dāng)發(fā)生異常時,直接 reject
              }).catch(e => reject(e))
            }
          })
        }

        為了測試,實現(xiàn)一個 sleep 函數(shù)

        const sleep = (seconds) => new Promise(resolve => setTimeout(() => resolve(seconds), seconds))

        以下示例進(jìn)行測試,沒有問題

        pAll([123]).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é)】如何實現(xiàn)選中復(fù)制的功能

        【滴滴】在 js 中如何實現(xiàn)繼承

        瀏覽 34
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
          
          

            1. 欧美裸体极品少妇 | v与子敌伦刺激对白播放 | 国产精品白丝jk白祙喷水网站 | 日韩专区中文字幕 | 夫妻生活黄色片 |