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

阐明逻辑批改胜利