参考大佬实现一个Promise

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

class MyPromise {
    #status = PENDING
    #result = undefined
    #handlers = []

    constructor(excutor) {
        const resolve = (data) => {
           this.#changeState(FULFILLED, data)
        }
        const reject = (e) => {
            this.#changeState(REJECTED, e)
        }
        try {
            excutor(resolve, reject)
        } catch(e) {
            reject(e)
        }
        
    }

    #changeState(status, v) {
        if(this.#status !== PENDING) return 
        this.#status = status
        this.#result = v
        this.#run()
    }

    #runRepeat(cb, resolve, reject ) {
        if(typeof cb !== 'function'){
            const settled = this.#status === FULFILLED ?  resolve : reject
            settled(this.#result)
            return 
        } 
        try {
            const temp = cb(this.#result)
            if(temp instanceof MyPromise) {
                temp.then(resolve, reject)
            } else {
                resolve(temp)
            }
        } catch(e) {
            reject(e)
        }   
    }

    #run() {
        if(this.#status === PENDING) return 
        while(this.#handlers.length) {
            const {
                onFulfilled,
                onRejected,
                resolve,
                reject
            } = this.#handlers.shift()

            if(this.#status === FULFILLED) {
                this.#runRepeat(onFulfilled, resolve, reject)
            } else if(this.#status === REJECTED) {
                this.#runRepeat(onRejected, resolve, reject)
            }
        }
    }

    then(onFulfilled, onRejected) {
        return new Promise((resolve, reject) => {
            this.#handlers.push({
                onFulfilled,
                onRejected,
                resolve,
                reject
            })
            this.#run()
        })
    }
}

const p = new MyPromise((resolve, reject) => {
    setTimeout( _ => {
        reject(1)
    }, 3000)
})

p.then(res => {
    console.log('1-success',res)
}).then(res => {
    console.log('2-success',res)
}).then(null, res => {
    console.log('3-error',res)
})


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值