SOURCE

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';

function MyPromise(executor) {
  this.state = PENDING;
  this.value = null;
  this.reason = null;
  this.onFulfilledCallbacks = [];
  this.onRejectedCallbacks = [];

  const resolve = (value) => {
    if (this.state === PENDING) {
      this.state = FULFILLED;
      this.value = value;
      this.onFulfilledCallbacks.forEach((fun) => {
        fun();
      });
    }
  };

  const reject = (reason) => {
    if (this.state === PENDING) {
      this.state = REJECTED;
      this.reason = reason;
      this.onRejectedCallbacks.forEach((fun) => {
        fun();
      });
    }
  };

  try {
    executor(resolve, reject);
  } catch (reason) {
    reject(reason);
  }
}

//原型上面的方法
//用settimeout来模拟异步调用,保证链式调用,即then方法中要返回一个新的promise,并将then方法的返回值进行resolve
MyPromise.prototype.then = function (onFulfilled, onRejected) {
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value
    onRejected = typeof onRejected === 'function' ? onRejected : (err) => { throw err}

    const promise2 = new MyPromise((resolve, reject) => {
        switch (this.state) {
        case FULFILLED:
            setTimeout(() => {
            try {
                const x = onFulfilled(this.value);
                resolve(x);
            } catch (reason) {
                reject(reason);
            }
            }, 0);
            break;
        case REJECTED:
            setTimeout(() => {
            try {
                const x = onRejected(this.reason);
                resolve(x);
            } catch (reason) {
                reject(reason);
            }
            }, 0);
            break;
        case PENDING:
            this.onFulfilledCallbacks.push(() => {
            setTimeout(() => {
                try {
                    const x = onFulfilled(this.value);
                    resolve(x);
                } catch (reason) {
                    reject(reason);
                }
            }, 0);
            });
            this.onRejectedCallbacks.push(() => {
            setTimeout(() => {
                try {
                    const x = onRejected(this.reason);
                    resolve(x);
                } catch (reason) {
                  reject(reason);
                }
            }, 0);
            });
            break;
        }
    });
    return promise2;
};


MyPromise.prototype.catch = function (onRejected) {
  return this.then(null, onRejected);
};

MyPromise.prototype.finally = function (fn) {
  return this.then(
    (value) => {
      fn();
      return value;
    },
    (reason) => {
      fn();
      throw reason;
    }
  );
};

//静态方法
MyPromise.resolve = function (value) {
  return new MyPromise((resolve, reject) => {
    resolve(value);
  });
};

MyPromise.reject = function (reason) {
  return new MyPromise((resolve, reject) => {
    reject(reason);
  });
};

//接受一个promise数组,当所有promise状态resolve后,执行resolve
MyPromise.all = function (promises) {
  return new Promise((resolve, reject) => {
    if (promises.length === 0) {
      resolve([]);
    } else {
      let result = [];
      let index = 0;
      for (let i = 0; i < promises.length; i++) {
        promises[i].then(
          (data) => {
            result[i] = data;
            if (++index === promises.length) {
              resolve(result);
            }
          },
          (err) => {
            reject(err);
            return;
          }
        );
      }
    }
  });
};

//接受一个promise数组,当有一个promise状态resolve后,执行resolve
MyPromise.race = function (promises) {
  return new Promise((resolve, reject) => {
    if (promises.length === 0) {
      resolve();
    } else {
      let index = 0;
      for (let i = 0; i < promises.length; i++) {
        promises[i].then(
          (data) => {
            resolve(data);
          },
          (err) => {
            reject(err);
            return;
          }
        );
      }
    }
  });
};

const promise = new Promise((resolve, reject) => {
    reject('ok')
}).then().then().then (
    data => {
        console.log('success', data)
    },err => {
        console.log('failed', err)
    }
)

console 命令行工具 X clear

                    
>
console