SOURCE

/**
 * @description 手动首先一个Promise
 * @author Zaoren
 * @date 2022-11-12
 */

/**
 * @desc Promise是通过new Promise来调用的,是一个类
 */
function MyPromise(executor) {
  // 1. 首先 Promise 内部有个状态,可能是: 'pending' | 'resolved' | 'rejected' 其中的一种,且一旦发生改变之后,就不能变了
  this.state = "pending"; // 初始状态是 pending
  // 2. 内部有一个变量来维护 resolved后 的值
  this.value = "";
  // 3. 内部有一个变量来存储 rejected 的原因
  this.reason = "";

  const self = this;
  // 4. 内部会暴露出 resolved、rejected 两个方法,用来给外部改变内部的状态

  this.onResolvedCallbacks = []
  this.onRejectedCallbacks = [];

  function resolved(val) {
    // 只有 pending 状态下才能改变状态。
    if (self.state === "pending") {
      self.state === "resolved";
      self.value = val;
      self.onResolvedCallbacks.forEach(callbacks => callbacks(self.value));
    }
  }

  function rejected(reason) {
    if (self.state === "pending") {
      self.state === "rejected";
      self.reason = reason;
      self.onRejectedCallbacks.forEach(callbacks => callbacks(self.reason));
    }
  }

  // 5. executor 构造函数是立即执行的
  try {
    executor(resolved, rejected);
  } catch (e) {
    rejected(e);
  }
}

/**
 * @desc then是 Promise 原型上的一个方法
 */
MyPromise.prototype.then = function (onFulfilled, onRejected) {
  // 1. 首先 resolved、rejected 不一定是一个函数 如果该参数不是函数,则会在内部被替换为 (x) => x
  onFulfilled =
    typeof onFulfilled === "function"
      ? onFulfilled
      : function (value) {
          return value;
        };
  onRejected =
    typeof onRejected === "function"
      ? onRejected
      : function (value) {
          return value;
        };
  const self = this;
  // 2. then为了支持链式调用,返回的也是一个Promise 
  return new MyPromise((resolve, rejected) => {

    // 封装前一个 promise 成功时执行的函数
    const decorateOnFulfilled = function() {
      try {
        const result = onFulfilled(self.value);
        return result instanceof MyPromise ? result.then(resolve, rejected) : resolve(result);
      } catch(e) {
        rejected(e);
      }
    }

    // 封装前一个promise失败时执行的函数
    const decorateOnRejected = function() {
      try {
        const result = onRejected(self.reason);
        return result instanceof MyPromise ? result.then(resolve, rejected) : rejected(result);
      } catch(e) {
        rejected(e);
      }
    }

    if (self.state === 'resolved') {
      // 如果 then 调用的时候,状态已经变成 resolved 的了
      decorateOnFulfilled(self.value);
    }
    if (self.state === 'rejected') {
      // 如果 then 调用的时候,状态已经变成 rejected 的了
      decorateOnRejected(self.reason);
    }
    if (self.state === 'pending') {
      // 大多数情况下 Promise 都是异步的。在调用 .then 方法的时候,MyPromise内部都还是 pending 状态
      // 所以需要在 MyPromise内部存一下回调函数, 等状态改变时再调用
      self.onResolvedCallbacks.push(decorateOnFulfilled);
      self.onRejectedCallbacks.push(decorateOnRejected);
    }
  })
};


/**
 * @desc Promise.resolve
*/
MyPromise.resolve = function(val) {
  if (val instanceof MyPromise) {
    return val;
  } else {
    return new MyPromise((resolve) => resolve(val))
  }
}

/**
 * @desc Promise.all 是一个静态方法,通过类名直接调用
 * 返回的也是一个 Promise
*/
MyPromise.all = function(promiseArr) {
  if (!Array.isArray(promiseArr)) {
    console.error('入参必须是数组');
    return;
  }
  let resultCount = 0;
  const resultArr = [];
  return new MyPromise((resolve, rejected) => {
    promiseArr.forEach(promiseItem => {
      MyPromise.resolve(promiseItem).then((value) => {
        resultCount += 1;
        resultArr.push(value);
        if (resultCount === promiseArr.length) {
          resolve(resultArr);
        }
      }, (reason) => {
        rejected(reason);
      })
    })
  })
}

/**
 * @desc Promise.race 是一个静态方法,他返回最先reolved的那个
 * 也是返回一个Promise
*/
MyPromise.race = function(promiseArr) {
  if (!Array.isArray(promiseArr)) {
    console.error('入参必须是数组');
    return;
  }
  return new MyPromise((resolve, reject) => {
    promiseArr.forEach((promiseItem) => {
      try {
        MyPromise.resolve(promiseItem).then((value) => {
          resolve(value);
        }, (reason) => {
          reject(reason);
        })  
      } catch(e) {
        reject(e);
      }
    })
  })
}


// case1: 首先 MyPromise的构造函数是立即执行的
const p1 = new MyPromise((resolve, rejected) => {
  console.log("promise-executor: 我是立即执行的");
  setTimeout(() => {
    // 调用Promise内部的resolve去改变内部状态。
    resolve("resolved val 300ms");
  }, 300);
});

const p2 = new MyPromise((resolve, rejected) => {
  setTimeout(() => {
    // 调用Promise内部的resolve去改变内部状态。
    resolve("resolved val 400ms");
  }, 400);
});

// case2: .then方法
p1.then(
  (res) => {
    console.log("promise-fullfiled:", res);
  },
  (res) => {
    console.log("rejected res:", res);
  }
);

// case3: .then支持链式调用
p1.then((res) => {
  return 'fullfiled res - then res';
}).then((res) => console.log("promise-then-then:", res));

// case4: MyPromise.all 当所有的Promise都返回之后才能
MyPromise.all([p1, p2]).then((res) => {
  console.log("promise-all: promiseRes", res);
});

// case5: MyPromise.race 返回最先resolve的那个
MyPromise.race([p1, p2]).then((res) => {
  console.log("promise-race: promiseRes", res);
});

// case6: MyPromise.resolve 会返回一个 Promise 对象
// console.log('promise-resolve: ', MyPromise.resolve(3));
console 命令行工具 X clear

                    
>
console