关于javascript:手写Promise14promise中then方法的链式调用

promise还有一个很重要的特点,
then办法能够被链式调用,前面一个then办法失去的值是上一个then办法的返回值

实现这个性能,须要两个步骤,第一是实现then办法的链式调用,第二是把上一个then办法回调函数返回值传递给下一个then办法。

then办法属于promise一个属性,而且then办法执行后返回一个promise对象,那么能够在then办法中new一个promise对象,并且返回,这样就能够始终执行then办法。而promise的构造函数接管一个执行器,并且要立刻执行,那么将原有的then办法中的代码放入到执行器中就能够实现这个要求。

而在执行器中的代码逻辑也须要批改,胜利和失败状态中都须要判断返回值类型,如果是一般值,就能够立刻执行,传递给下一个promise对象,如果是promise对象,须要查看他的状态,并传递给下一个promise对象。

解决返回值类型专用办法

function resolvePromise(e, resolve, reject) {
    if (e instanceof MyPromise) {
        // promise对象
        // e.then((value) => {
        //     resolve(value)
        // }, (reason) => {
        //     reject(reason)
        // })
        // 简化代码
        e.then(resolve, reject);
    } else {
        //一般值
        resolve(e);
    }
}

then办法批改

    then(successCallback, failedCallback) {
        let promise2 = new Promise((resolve, reject) => {
            // 状态判断
            if (this.status === FULFILLED) {
                // 定义胜利回调返回值,传给下一个then的胜利回调
                let successRtn = successCallback(this.value);
                // 判断successRtn 的值是一般值还是promise对象
                // 如果是一般值,间接调用resolve 
                // 如果是promise对象,查看promsie对象返回的后果 
                // 再依据promise对象返回的后果,决定调用resolve 还是调用reject
                // 执行resolve办法,相当于把返回值传递给下一个then的胜利回调函数
                resolvePromise(successRtn, resolve, reject);
            } else if (this.status === REJECTED) {
                let failedRtn = failedCallback(this.reason);
                resolvePromise(failedRtn, resolve, reject);
            } else {
                // 期待,须要将胜利回调和失败回调存储起来,期待须要执行的时候才执行
                this.successCallback.push(successCallback);
                this.failedCallback.push(failedCallback);
            }
        });
        return promise2;
    }

测试代码

let promise = new MyPromise((resolve, reject) => {
    resolve('---success----');
    // setTimeout(()=>{
    //     resolve('success')
    // },3000)
    // reject("---failed----");
})

function other() {
    return new MyPromise((resolve, reject) => {
        resolve("a  promise object")
    })
}
promise.then(value => {
    console.log(value);
    return other();
}, reason => {
    console.log(reason)
}).then(value => {
    console.log(value)
})

测试打印

---success----
a  promise object

阐明逻辑批改胜利

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理