<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2545字,需瀏覽 6分鐘

           ·

          2021-03-31 09:46

          搖籃山-圣克萊爾湖國(guó)家公園,澳大利亞塔斯馬尼亞州
          (? 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([1Promise.resolve(2)])
          //-> [1, 2]

          await Promise.all([1Promise.reject(2)])
          //-> Throw Error: 2
          1. 傳入一個(gè)數(shù)組,可包含 Promise,也可包含普通數(shù)據(jù)
          2. 數(shù)組中 Prmise 并行執(zhí)行
          3. 但凡有一個(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([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é)】如何實(shí)現(xiàn)選中復(fù)制的功能

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

          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  51操逼 | 亚洲欧美性爱在线视频 | 午夜AV福利电影 | www拍拍视频 | 亚洲巨幕av |