编辑代码

class MyPromise {
    constructor(fn) {
        this.promiseState = 'pendding'; //设置初始状态
        this.resolveFn = null; //保存then 方法中成功的回调
        this.rejectFn = null; // 保存then 方法中失败的回调
        this.resolveResult = null;
        this.rejectReason = null;
        fn(this.resolve.bind(this), this.reject.bind(this))
    }
    resolve = (result) => {
        if (this.promiseState === 'pendding') {
            this.promiseState = 'fulfilled'
            this.resolveResult = result;
            if (this.resolveFn) {
                this.resolveFn(result)
            }
        }
    }
    reject(reason) {
        if (this.promiseState === 'pendding') {
            this.promiseState = 'rejected'
            this.rejectReason = reason;
            if (this.rejectFn) {
                this.rejectFn(reason)
            }
        }
    }

    then(resolve, reject) {
        function setThenPromise(result, onResolve) {
            if (result instanceof MyPromise) {
                result.then(res => {
                    onResolve(res)
                }, reject => {
                    onResolve(reject)
                })
            } else {
                onResolve(result)
            }
        }
        let thenPromise = new MyPromise((onResolve, onReject) => {
            if (typeof resolve === 'function') {
                setTimeout(() => {
                    if (this.promiseState === 'pendding') {
                        resolve && (this.resolveFn = function (result) {
                            setThenPromise(resolve(result), onResolve)
                        });
                        reject && (this.rejectFn = function (reason) {
                            setThenPromise(reject(reason), onResolve)
                        })
                    } else if (this.promiseState === 'fulfilled') {
                        setThenPromise(resolve(this.resolveResult), onResolve)
                    } else if (this.promiseState === 'rejected') {
                        setThenPromise(reject(this.rejectReason), onResolve)
                    }
                })
            }
        })
        return thenPromise
    }
}


const promise = new MyPromise((resolve, reject) => {
    resolve('MyPromise返回值')
})
promise.then(res => {
    console.log('链式1', res)
    return new MyPromise((resolve, reject) => {
        setTimeout(function () {
            resolve('MyPromise链式1 返回结果')
        }, 100)

    })
}).then(res => {
    console.log('链式2', res)
    return res + '链式2 返回结果'
}).then(res => {
    console.log('链式3', res)
    return res + '链式3 返回结果'
}).then(res => {
    console.log('链式4', res)
})
setTimeout(function () {
    const promise = new Promise((resolve, reject) => {
        resolve('Promise返回值')
    })
    promise.then(res => {
        console.log('链式1', res)
        return new Promise((resolve, reject) => {
            setTimeout(function () {
                resolve('Promise链式1 返回结果')
            }, 100)

        })
    }).then(res => {
        console.log('链式2', res)
        return res + '链式2 返回结果'
    }).then(res => {
        console.log('链式3', res)
        return res + '链式3 返回结果'
    }).then(res => {
        console.log('链式4', res)
    })
}, 2000)