SOURCE

// 手写Promise
// promise.then微任务

class MyPromise {
    constructor(fn) {
        try {
            fn(this.resolve.bind(this), this.reject.bind(this));
        } catch {
            
        }
    }

    state = 'PENDING';
    message = undefined;
    successCallbacks = [];
    failCallbacks = [];

    resolve(val) {
        setTimeout(() => {
            this.state = 'FULFILLED';
            this.message = val;
            this.successCallbacks.forEach(fn => {
                fn(this.message)
            })
        })
    }

    reject(err) {
        setTimeout(() => {
            this.state = 'REJECTED';
            this.message = err;
            this.failCallbacks.forEach(fn => {
                fn(this.message)
            })
        })
    }

    then(successFn, failFn) {
        if(this.state === 'PENDING') {
            this.successCallbacks.push(successFn);
            this.failCallbacks.push(failFn);
        }
        if(this.state === 'FULFILLED') {
            successFn(this.message);
        }
        if(this.state === 'REJECTED') {
            failFn(this.message);
        }
    }
}

MyPromise.all = function(promises) {
    const len = promises.length;
    const result = [];
    let count = 0;
    return new Promise((resovle, reject) => {
        for(let i=0; i<len; i++) {
            promises[i].then(res => {
                count++;
                result.push(res);
                if(count === length) {
                    resolve(result);
                }
                },err => {
                reject(err);
                
            })
        }
    })
}

MyPromise.race = function(promises) {
    let flag = true;
    const len = promises.length;
    return new Promise((resolve, reject) => {
        for(let i=0; i<len; i++) {
            promises[i].then(res => {
                if(flag) {
                    resolve(res);
                    flag = false;
                }
            }, err => {
                reject(err);
            })
        }
    })
}

const p = new MyPromise((resolve, reject) => {
    resolve(3);
    console.log(1);
    throw new Error('err');
}).then(res => {
    console.log(res);
}, err => {
    console.log(err);
})

console.log(2);
console 命令行工具 X clear

                    
>
console