SOURCE

const PENDING = 'pending' // 等待
const FULLFILLED = 'fullfilled' // 成功
const REJECTED = 'rejected' // 失败

class MyPromise {
    constructor(generator) {
        try {
            generator(this.resolve, this.reject)
        } catch (e) {
            this.reject(e)
        }
    }
    status = PENDING // promise 状态
    successData = undefined // 成功之后的值
    failReason = undefined // 失败后的原因
    successArr = [] // 成功的回调函数,默认为空数组,为了链式调用时存储多个成功的回调函数
    failArr = [] // 失败的回调函数,默认为空数组,为了链式调用时存储多个失败的回调函数

    // 成功函数resolve,这里必须是箭头函数,需要修改this的指向

    resolve = (value) => {
        if (this.status === PENDING) {
            this.status = FULLFILLED // 状态值修改为成功
            this.successData = value // 记住成后的数据
            // 判断成功回调是否存在,如果存在就调用,但是下面这种只适用于只有一个成功回调的情况,所以需要修改
            // if(this.sucessCallBack){
            //     this.sucessCallBack(this.value)
            // }

            // while循环:只要this.successCallBack的长度不是0就会执行此函数
            while (this.successArr.length) {
                // shift:删除原数组第一项,并将其值返回
                // this.successCallBack.shift():获取this.successCallBack数组的第1个函数,获取后再删除原数组的第1个值
                this.successArr.shift()
            }
        } else {
            return // 如果状态不是等待,阻止程序向下执行
        }
    }

    // 失败函数
    reject = (reason) => {
        if (this.status === PENDING) {
            this.status = REJECTED // 状态值修改为失败
            this.failReason = reason // 记住失败后的原因
            while (this.successArr.length) {
                this.successArr.shift()
            }
        } else {
            return // 如果状态不是等待,阻止程序向下执行
        }
    }

    then(successCallBack, failCallBack) {
        successCallBack = successCallBack ? successCallBack : (value) => values
        failCallBack = failCallBack ? failCallBack : (reason) =>{throw Error(reason)}
        }
    }

console 命令行工具 X clear

                    
>
console