Skip to content

Promise 衍生方法(catch, all, race, deferred)的实现

ts
Promise.resolve = function <T>(value?: T | PromiseLike<T>): Promise<Awaited<T>> | Promise<void> {
  return new Promise<Awaited<T>>((resolve) => resolve(value as Awaited<T>));
};

Promise.reject = function (reason: unknown) {
  return new Promise<never>((_, reject) => reject(reason));
};

Promise.prototype.catch = function <T>(onRejected: (reason: unknown) => T) {
  return this.then(null, onRejected);
};

Promise.prototype.finally = function (onFinally: () => void) {
  return this.then(
    (value) => {
      onFinally();
      return value;
    },
    (reason) => {
      onFinally();
      throw reason;
    }
  );
};

Promise.race = function <T>(promises: Promise<T>[]) {
  return new Promise<T>((resolve, reject) => {
    promises.forEach((promise) => {
      promise.then(resolve, reject);
    });
  });
};

Promise.all = function <T>(promises: Promise<T>[]) {
  return new Promise<T[]>((resolve, reject) => {
    let resolvedCount = 0;
    const result: T[] = [];
    promises.forEach((promise, index) => {
      promise.then((value) => {
        result[index] = value;
        resolvedCount += 1;
        if (resolvedCount === promises.length) {
          resolve(result);
        }
      }, reject);
    });
  });
};