SOURCE

class MyPromise {
    constructor(executor) {
        this.initValue();
        this.initBind();
        try {
            executor(this.resolve, this.reject);
        } catch (e) {
            this.reject(e);
        }

    }

    initBind() {
        this.resolve = this.resolve.bind(this);
        this.reject = this.reject.bind(this);
    }

    initValue() {
        this.promiseStatus = 'pending';
        this.promiseResult = null;
        this.onFulfilledCallbacks = [];
        this.onRejectedCallbacks = [];
    }

    resolve(value) {
        if (this.promiseStatus !== 'pending') return;
        this.promiseStatus = 'fulfilled';
        this.promiseResult = value;
        while (this.onFulfilledCallbacks.length) {
            this.onFulfilledCallbacks.shift()(this.promiseResult);
        }
    }

    reject(reason) {
        if (this.promiseStatus !== 'pending') return;
        this.promiseStatus = 'rejected';
        this.promiseResult = reason;
        while (this.onRejectedCallbacks.length) {
            this.onRejectedCallbacks.shift()(this.promiseResult);
        }
    }

    then(onFulfilled, onRejected) {
        // console.log('onFulfilled', onFulfilled)
        // console.log('onRejected', onRejected)
        // console.log('this.promiseStatus', this.promiseStatus)

        // 参数校验,确保一定是函数
        onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val => val
        onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }

        const thenPromise = new MyPromise((resolve, reject) => {
            const resolvePromise = cb => {
                setTimeout(() => {
                    try {
                        const x = cb(this.promiseResult);
                        if (x === thenPromise) {
                            throw new Error('不能返回自身');
                        }
                        if (x instanceof MyPromise) {
                            x.then(resolve, reject);
                        } else {
                            resolve(x);
                        }
                    } catch (e) {
                        reject(e);
                        throw new Error(e);
                    }
                })
            }

            if (this.promiseStatus === 'fulfilled') {
                resolvePromise(onFulfilled);
            } else if (this.promiseStatus === 'rejected') {
                resolvePromise(onRejected);
            } else if (this.promiseStatus === 'pending') {
                this.onFulfilledCallbacks.push(() => resolvePromise(onFulfilled));
                this.onRejectedCallbacks.push(() => resolvePromise(onRejected));
            }
        })

        return thenPromise;
    }

    catch(onRejected) {
        this.then(undefined, onRejected);
    }

    all(promises) {
        const result = [];
        const count = 0;
        return new MyPromise((resolve, reject) => {
            const addData = (index, value) => {
                result[index] = value;
                count++;
                if (count === promises.length) resolve(result);
            }
            promises.forEach((item, index) => {
                if (item instanceof MyPromise) {
                    item.then(res => {
                        addData(index, res);
                    }, err => reject(err));
                } else {
                    addData(index, item);
                }
            })
        })
    }

    race(promises) {
        return new MyPromise((resolve, reject) => {
            promises.forEach((item) => {
                if (item instanceof MyPromise) {
                    item.then(res => {
                        resolve(res);
                    }, err => {
                        reject(err);
                    })
                } else {
                    resolve(item);
                }
            })
        })
    }
}

// const test1 = new MyPromise((resolve, reject) => {
//     resolve(100);
//     reject('失败1');
// }).then(res => console.log('res',res), err => console.log('err', err))
// console.log('test1', test1)

// const test2 = new MyPromise((resolve, reject) => {
//     reject('失败');
//     resolve('成功1');
// }).then(res => console.log('res',res), err => console.log('err', err))
// console.log('test2', test2)

// const test3 = new MyPromise((resolve, reject) => {
//     throw ('错误')
// })
// console.log('test3', test3)

// const test2 = new MyPromise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('成功') // 1秒后输出 成功
//         // resolve('成功') // 1秒后输出 失败
//     }, 1000)
// }).then(res => console.log(res), err => console.log(err))

// const p2 = new MyPromise((resolve, reject) => {
//     setTimeout(() => {
//         reject('失败')
//     }, 1000)
// }).then(res => console.log(res), err => {
//     console.log('err222', err)
// })
// console.log('p2', p2)

// const test4 = new MyPromise((resolve, reject) => {
//     resolve(100);
// }).then(res => 2 * res, err => 3 * err)
//     .then(res => console.log('res', res), err => console.log('err1', err))

// const test5 = new MyPromise((resolve, reject) => {
//     // resolve(100) // 输出 状态:失败 值:200
//     reject(100) // 输出 状态:成功 值:300
//     // 这里可没搞反哦。真的搞懂了,就知道了为啥这里是反的
// }).then(res => new MyPromise((resolve, reject) => reject(2 * res)), err => new Promise((resolve, reject) => resolve(3 * err)))
//     .then(res => console.log('成功', res), err => console.log('失败', err))

// const test6 = new MyPromise((resolve, reject) => {
//     resolve(1)
// }).then(res => console.log(res), err => console.log(err))

// console.log(2)

// // 测试用例2:间接循环引用
// const test2 = new MyPromise((resolve) => {
//     resolve(200);
// });

// let p2;
// p2 = test2.then(() => {
//     return p2; // 间接引用自身
// });

const test7 = new MyPromise((resolve, reject) => {
    throw error;
}).catch(e => {
    console.log('e', e);
})


console 命令行工具 X clear

                    
>
console