js实现promise.all promise.race promise.resolve

最近在准备面试,关于 promise 是面试的热点和考点。不定面试官心情好了就会让你写个 promise 的 api

废话不多说,下面是我写的代码,如有不严谨之处希望指出。

promise.all
当所有 promise 全部 resolve 或者 一个 reject 时,返回结果。

function myPromiseAll(promiseArr) {
    
    
  let length = promiseArr.length;
  let resolvedNum = 0;
  let resultArr = [];
  return new Promise((resolve, reject) => {
    
    
    for (let i = 0; i < length; i++) {
    
    
      Promise.resolve(PromiseArr[i]).then(
        (value) => {
    
    
          resultArr[i] = value;
          resolvedNum++;
          if (resolvedNum === length) {
    
    
            return resolve(resultArr);
          }
        },
        (err) => {
    
    
          return reject(err);
        }
      );
    }
  });
}

promise.resolve
如果原本就是 promise 类型的,那么直接返回。如果是有 then 属性的对象,且then属性是个函数的,就返回一个 promise,这个 promise 中的方法用这个 then 属性。如果是一个值的话,就直接作为 promise,且在 resolve 中传入这个值。

function myPromiseResolve(value) {
    
    
  if (value instanceof Promise) {
    
    
    return value;
  }
  if (
    Object.prototype.toString.call(value) === "[object Object]" &&
    typeof value.then === "function"
  ) {
    
    
    return new Promise(value.then);
  }
  return new Promise((resolve) => {
    
    
    resolve(value);
  });
}

promise.race
返回第一个结束的 promise 的值

function myPromiseRace(promiseArr) {
    
    
  let checkFirst = true;
  return new Promise((resolve, reject) => {
    
    
    for (let i = 0; i < promiseArr.length; i++) {
    
    
      Promise.resolve(promiseArr[i]).then(
        (value) => {
    
    
          if (checkFirst) {
    
    
            checkFirst = false;
            resolve(value);
          }
        },
        (err) => {
    
    
          if (checkFirst) {
    
    
            checkFirst = false;
            reject(err);
          }
        }
      );
    }
  });
}

猜你喜欢

转载自blog.csdn.net/qq_42535651/article/details/108919352