手写Promise

41 阅读1分钟
        let successQueue = [];
        let failQueue = [];
        class MyPromise {
            #state = 'pending';
            #result;
            constructor(fn) {
                const resolve = (result) => {
                    if (this.#state !== 'pending') return
                    this.#result = result
                    this.#state = 'fulfilled'
                    while (successQueue.length) successQueue.shift()(result)
                }
                const reject = (result) => {
                    if (this.#state !== 'pending') return
                    this.#result = result
                    this.#state = 'rejected'
                    while (failQueue.length) failQueue.shift()(result)
                }
                try {
                    fn(resolve, reject)
                } catch (e) {
                    reject(e)
                }
            }
            then(successCallback, failCallback) {
                const p = new MyPromise((res, rej) => {
                    if (this.#state === 'pending') {
                        successQueue.push(successCallback)
                        failQueue.push(failCallback)
                    }
                    if (this.#state === 'fulfilled') {
                        const result = successCallback(this.#result)
                        if (result instanceof MyPromise) {
                            result.then(res, rej)
                        } else {
                            res(result)
                        }
                    }
                    if (this.#state === 'rejected') rej(failCallback(this.#result))
                })
                return p
            }
        }