• 當前位置:首頁 > IT技術 > Web編程 > 正文

    js 手動實現 promise.all的功能
    2021-10-12 14:20:40

    在中高級面試中,實現一個promise.all是一個頻率較高的面試題
    首先分析下 promise.all(),(參考MDN)
    1. 接收一個promise的iterable類型(注:Array,Map,Set都屬于ES6的iterable類型)的參數
    2. 返回一個promsie實例
    3. 參數里所有的promise都成功回調后 resolve返回一個數組結果,數組順序和參數順序一致
    4. 參數里有一個失敗的就會reject,并且reject第一個失敗的信息
    // 下面實現一下
      Promise.prototype.all = function (iterators) {
        const promises = Array.from(iterators); // 強制轉換成數組
        const len = promises.length; // 記錄數組的長度
        let count = 0; // 標記成功的個數
        let resultList = [];// 要返回的 數組結果
        return new Promise((resolve, reject) => {  // 返回一個promise 
          for (let index in promises) { // for 循環配合 let 確保 數組結果和參數順序一致
            Promise.resolve(promises[index])         // Promise.resolve,如果是參數是promise 直接返回,如果不是則直接執行Promise.resolve方法 到 then 接受 
              .then((result) => {
                count++;          // 記錄個數,等于len時 resolve
                resultList[index] = result; // 對應賦值結果
                if (count === len) {
                  resolve(resultList);
                }
              })
              .catch(e => { 
                reject(e); // 當收到錯誤時,直接reject,返回錯誤信息
              })
          }
        })
      }
    
    
     let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('1')
        }, 5000);
      })
      let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('2')
        }, 2000);
      })
      let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('3')
        }, 3000);
      })
      let p4 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('4')
        }, 4000);
      })
      Promise.all([p1, p2, p3, p4]).then(res => {
        console.log(res,'res') 
      }).catch(err => {
        console.log(err)
      })
    // ?['1', '2', '3', '4'] 'res' 
    
    理解其中的邏輯,其實并不復雜

    本文摘自 :https://www.cnblogs.com/

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码