promise实现中是如何处理then的返回值为promise的?

问题描述

promise的实现过程中,在处理上一个then的返回值,如果遇到普通值(如数字,字符串)则直接用当前Promise对象(称作为P2)去resolve,如果then返回值依然是Promise对象(称作为x),则要递归进行x.then(resolve,reject)操作,最后使得P2.resolve('x最后返回值'). 关于这个递归进行resolvePromise的方法不清楚工作机制

相关代码

// 一种实现

function  MyPromise(fn) {
    var  value  =  null;
    var  status  =  'pending';
    var  deferreds  = [];
    this.then =  function (onFulfilled) {
        return  new  MyPromise(resolve  => {
            if (status  ===  'pending') {
                deferreds.push({
                    onFulfilled: onFulfilled, // resolve
                    resolve: resolve
                });
            } else {
                var  res  =  onFulfilled(value);
                resolve(res);
            }
        })
    }

    function  resolve(v) {
        setTimeout(function () {
            if (v  instanceof  MyPromise) {
                v.then(resolve); // 如果v是一个promise,那就会等待v这个promise成完成态的时候,再次触发当前promise的resolve方法。
            } else {
                value  =  v;
                status  =  'fulfilled'
                deferreds.forEach(function (deferred) {
                    var  res  =  deferred.onFulfilled(value);
                    deferred.resolve(res); // 回调函数的返回值 会传给下一个promise进行resolve
                    })
            }
        }, 0)
    }

    fn(resolve);
}



// 下面我们写段代码验证一下
var  p1  =  new  MyPromise(resolve  => {
    setTimeout(() => {
        resolve('1')
    }, 2000)
}).then((res) => {
    console.log(res);
    return  new  MyPromise(resolve  => {
        setTimeout(() => {
            resolve(666)
        }, 0);
    });
}).then(res  => {
    console.log(res  +  222)
})
//console.log(p2 instanceof MyPromise)

请问下当resolve方法遇到值为Promise 是如何进行的,并最后把值传递的

待解决 悬赏分:20 - 离问题结束还有 505天20小时42分29秒
反对 0举报 0 收藏 0

我来回答

回答2