残缺代码如下:

// 定义三个状态const PENDING = 'pending'; // 期待const FULFILLED = 'fulfilled'; // 胜利const REJECTED = 'rejected'; // 失败class MyPromise {    constructor(executor) {        try {            executor(this.resolve, this.reject);        } catch (e) {            this.reject(e)        }    }    // 定义一个示意状态的属性    status = PENDING;    // 定义两个实例属性,示意胜利之后的值和失败后的起因    value = undefined;    reason = undefined;    // 胜利回调    successCallback = [];    // 失败回调    failedCallback = [];    // 两个属性,这里定义成箭头函数,是因为咱们在应用的时候是间接调用,    // 而一般函数外部this的指向window或者是undefined,定义成箭头函数使函数外部this指向指向类实例对象    resolve = value => {        // 如果状态不是期待,阻止程序向下进行        if (this.status !== PENDING) return        // 更改状态为胜利        this.status = FULFILLED        // 保留胜利的值        this.value = value;        // 判断胜利回调是否存在,如果存在就调用        // this.successCallback && this.successCallback(this.value);        while (this.successCallback.length) {            this.successCallback.shift()();        }    }    reject = reason => {        // 如果状态不是期待,阻止程序向下进行         if (this.status !== PENDING) return        // 更改状态为失败        this.status = REJECTED        // 保留失败的起因        this.reason = reason;        // 判断失败回调是否存在,存在就调用        // this.failedCallback && this.failedCallback(this.reason);        while (this.failedCallback.length) {            this.failedCallback.shift()();        }    }    then(successCallback, failedCallback) {        // 可选参数        successCallback = successCallback ? successCallback : value => value;        failedCallback = failedCallback ? failedCallback : reason => {            throw reason        };        let promise2 = new Promise((resolve, reject) => {            // 状态判断            if (this.status === FULFILLED) {                setTimeout(() => {                    try {                        // 定义胜利回调返回值,传给下一个then的胜利回调                        let successRtn = successCallback(this.value);                        // 判断 x 的值是一般值还是promise对象                        // 如果是一般值 间接调用resolve                         // 如果是promise对象 查看promsie对象返回的后果                         // 再依据promise对象返回的后果 决定调用resolve 还是调用reject                        // 执行resolve办法,相当于把返回值传递给下一个then的胜利回调函数                        resolvePromise(promise2, successRtn, resolve, reject);                    } catch (e) {                        reject(e);                    }                }, 0);            } else if (this.status === REJECTED) {                setTimeout(() => {                    try {                        let failedRtn = failedCallback(this.reason);                        resolvePromise(promise2, failedRtn, resolve, reject);                    } catch (e) {                        reject(e)                    }                }, 0);            } else {                // 期待,须要将胜利回调和失败回调存储起来,期待须要执行的时候才执行                this.successCallback.push(() => {                    setTimeout(() => {                        try {                            let successRtn = successCallback(this.value);                            resolvePromise(promise2, successRtn, resolve, reject);                        } catch (e) {                            reject(e);                        }                    }, 0);                });                this.failedCallback.push(() => {                    setTimeout(() => {                        try {                            let failedRtn = failedCallback(this.reason);                            resolvePromise(promise2, failedRtn, resolve, reject);                        } catch (e) {                            reject(e)                        }                    }, 0);                });            }        });        return promise2;    };    catch (failCallback) {        this.then(undefined, failCallback)    };    finally(callback) {        return this.then(value => {            return MyPromise.resolve(callback()).then(() => value);        }, reason => {            return MyPromise.resolve(callback()).then(() => {                throw reason            })        })    };    static all(array) {        let result = [];        // 用于判断以后执行值是否等于数组长度,相等时才执行resolve()        let idx = 0;        return new MyPromise((resolve, reject) => {            // 增加元素办法            function addElement(index, value) {                result[index] = value;                idx++;                if (idx === array.length) {                    resolve(result)                }            }            for (let i = 0; i < array.length; ++i) {                let cur = array[i];                // 判断cur是否是一般值,一般值间接进入result数组,                // promise对象就执行它,调用then办法,执行胜利则增加到result数组,如果失败                if (cur instanceof MyPromise) {                    // promise对象                    cur.then(value => addElement(i, value), reason => reject(reason))                } else {                    // 一般值                    addElement(i, array[i]);                }            }        })    }    static race(array) {        return new MyPromise((resolve, reject) => {            for (let i = 0; i < array.length; ++i) {                let cur = array[i];                if (cur instanceof MyPromise) {                    cur.then(resolve, reject);                } else {                    resolve(cur)                }            }        })    }    static resolve(e) {        if (e instanceof MyPromise) {            return e;        } else {            return new MyPromise(resolve => resolve(e))        }    }}function resolvePromise(promise2, e, resolve, reject) {    if (promise2 === e) {        return reject(new TypeError("Chaining cycle detected for promise #<Promise>"))    }    if (e instanceof MyPromise) {        // promise对象        // e.then((value) => {        //     resolve(value)        // }, (reason) => {        //     reject(reason)        // })        // 简化代码        e.then(resolve, reject);    } else {        //一般值        resolve(e);    }}module.exports = MyPromise;