Promise.all 和 Promise.race的简单实现

简介

  • Promise.all()

    • 参数
      是一个可迭代对象,数组或字符串。
    • 返回值
      • 如果传入的参数是一个空的可迭代对象,则返回一个已完成状态的 Promise。
      • 如果传入的参数不包含任何 promise,则返回一个异步完成 Promise。注意:Google Chrome 58 在这种情况下返回一个已完成状态的 Promise。
      • 其它情况下返回一个处理中的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。
    • 简单实现
      function myAll(promiseArr){
        let result = []; // 保存每个Promise的结果
        let count = 0;   // 计数,用来判断是否都执行完了
        return new Promise((resolve, reject) => {
          for(let i = 0; i < promiseArr.length; i++){
            let item = promiseArr[i];
            if(isPromise(item)){
              item.then(res => {
                result[i] = res;
                count++;
                if(count === promiseArr.length){
                  resolve(result);
                }
              },err => {
                reject(err);
              })
            }else{
              result[i] = item;
              count++;
              if(count === promiseArr.length){
                resolve(result);
              }
            }
          }
        })
      }
      // 判断是否是 Promise
      function isPromise(x){
        return (x instanceof Promise);
      }
    
      let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(1)
        },2000)
      })
    
      let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(2)
        },1000)
      })
      // 调用
      myAll([p1,p2]).then(res => {
        console.log(res);
      })
    
    
  • Promise.race()

    • 参数
      是一个可迭代对象,数组或字符串。
    • 返回值
      一个待定的 Promise 只要给定的迭代中的一个promise解决或拒绝,就采用第一个promise的值作为它的值,从而异步地解析或拒绝(一旦堆栈为空)。
    • 简单实现
     // 我的 Promise.race()
     function myRace(promiseArr){
       return new Promise((resolve, reject) => {
         for(item of promiseArr){
           if(isPromise(item)){
               item.then(res => {
               resolve(res);
             }).catch(res => {
               reject(res);
             })
           }else{
             resolve(item);
           }
         }
       })
     }
     // 判断传入的参数是不是Promise
     function isPromise(x){
       return (x instanceof Promise);
     }
    
     let p1 = new Promise((resolve, reject) => {
       setTimeout(() => {
         resolve(1)
       },2000)
     })
    
     let p2 = new Promise((resolve, reject) => {
       setTimeout(() => {
         reject(2)
       },3000)
     })
     // 调用 myRace
     myRace([p1,p2]).then(res => {
       console.log(res)
     })
    
posted @ 2021-10-06 16:15  南方的北极星  阅读(137)  评论(0)    收藏  举报