本文作者:问几许

实现 Promise.all 函数

问几许 3年前 ( 2020-04-20 ) 7248 抢沙发
实现 Promise.all 函数摘要: function promiseAll1(promiseArr) {  return new Promise(fun...
function promiseAll1(promiseArr) {
  return new Promise(function (resolve, reject) {
    if (!(promiseArr instanceof Array)) {
      throw new TypeError("promiseArr must be an Array");
    }

    let resArr = []; // 存放结果
    let index = 0;

    if (promiseArr.length === 0) resolve(resArr);

    for (let i in promiseArr) {
      Promise.resolve(promiseArr[i])
        .then(
          (res) => {
            resArr[i] = res; // 存每次结果
            index++;
            // 数组函数全执行完,便返回
            if (index === promiseArr.length) {
              return resolve(resArr);
            }
          },
          (err) => {
            return reject(err);
          }
        )
        .catch((err) => {
          console.log(err);
        });
    }
  });
}

function promiseAll2(promiseArr) {
  let resArr = []; //用于存放每次执行后返回结果
  return new Promise(function (resolve, reject) {
    let i = 0;
    next(); // 开始逐次执行数组中的函数
    function next() {
      promiseArr[i].then(function (res) {
        resArr.push(res); // 存储每次得到的结果
        i++;
        if (i == promiseArr.length) {
          // 如果函数数组中的函数都执行完,便resolve
          resolve(resArr);
        } else {
          next();
        }
      });
    }
  });
}

function promiseAll3(promiseArr) {
  return new Promise((resolve, reject) => {
    let index = 0;
    let resArr = [];
    if (promiseArr.length === 0) {
      resolve(resArr);
    } else {
      for (let i = 0; i < promiseArr.length; i++) {
        Promise.resolve(promiseArr[i]).then(
          (data) => {
            resArr[i] = data;
            if (++index == promiseArr.length) {
              console.log(index);
              resolve(resArr);
            }
          },
          (err) => {
            reject(err);
            return;
          }
        );
      }
    }
  });
}

// p1, p2, p3
var p1 = new Promise((resolve, reject) => {
  resolve("111");
});

var p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("222");
  }, 2000);
});

var p3 = new Promise((resolve, reject) => {
  resolve("333");
});

// 调用
const start = new Date();

promiseAll1([p1, p2, p3]).then((res) => {
  console.log(res);
  const ms = new Date() - start;
  console.log(`time - ${ms}ms`);
});

promiseAll2([p1, p2, p3]).then((res) => {
  console.log(res);
  const ms = new Date() - start;
  console.log(`time - ${ms}ms`);
});

promiseAll3([p1, p2, p3]).then((res) => {
  console.log(res);
  const ms = new Date() - start;
  console.log(`time - ${ms}ms`);
});

Promise.all([p1, p2, p3]).then((res) => {
  console.log(res);
  const ms = new Date() - start;
  console.log(`time - ${ms}ms`);
});


文章版权及转载声明

作者:问几许本文地址:https://wenjixu.com/blog/145.html发布于 3年前 ( 2020-04-20 )
文章转载或复制请以超链接形式并注明出处问几许

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,7248人围观)参与讨论

还没有评论,来说两句吧...