SOURCE

class MyPromise {
    constructor(handle) {
        if(typeof handle !== 'function'){
            return 'Promise参数必须为函数'
        }
        this.status = 'PENDING';
        this.value = null;
        this.onFulfIlledQueue = [];
        this.onRejectedQueue = [];
        try {
            handle(this.resolve.bind(this), this.reject.bind(this));
        } catch {
            this.reject();
        }

        this.then = (resolve, reject) => {
            switch(this.status) {
                case 'PENDING':
                    this.onFulfIlledQueue.push(resolve);
                    this.onRejectedQueue.push(reject);
                    break;
                case 'FULFILLED':
                    resolve(this.value);
                    break;
                case 'REJECTED':
                    reject(this.value);
            }
        }
    }

    resolve(val){
        this.status = 'FULFILLED';
        this.value = val;
        let handle = this.onFulfIlledQueue.shift()
        while(handle){
            handle(val);
            handle = this.onFulfIlledQueue.shift();
        }
    }

    reject(val){
        this.status = 'REJECTED';
        this.value = val;
        let handle = this.onRejectedQueue.shift()
        while(handle){
            handle(val);
            handle = this.onRejectedQueue.shift();
        }
    }
}

new MyPromise((resolve, reject) => {
  console.log('老板曰: 一秒做完手上的事来一下我办公室,做不完滚蛋')
  setTimeout(() => {
    if (false) { // 臣妾做不到啊
      resolve('做完了手上的事,去老板办公室')
    } else {
      reject('做不完,滚蛋')
    }
  }, 1000)
}).then(res => {
  console.log(`1s 后:${res}`)
}, error => {
  console.log(`1s 后:${error}`)
})
console 命令行工具 X clear

                    
>
console