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

ritsu
  • 746

问题描述

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);
}

/*
* 普通值 则让新的promise 去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 是如何进行的,并最后把值传递的

回复
阅读 3.7k
2 个回答

其实 v.then(resolve) 这里是简写了,按照逻辑来写的话,可以是下面这个样子的:

v.then(value => resolve(value)) // 传值很明显了吧

现在应该比较好理解了。

其实就是当接受到的是一个 Promise 时,就把当前 Promise 的状态交给这个 Promise 来处理就可以了,所以这里通过指定成功的回调直接将自己的 resolve 方法交给这个接受到的 Promise

刚好我有写到过这个,可以提供 参考 一哈哈哈。

宣传栏