为了账号安全,请及时绑定邮箱和手机立即绑定

Promise中返回Promise为什么会立即执行?请大牛解释下原理谢谢

Promise中返回Promise为什么会立即执行?请大牛解释下原理谢谢

泛舟湖上清波郎朗 2018-11-09 23:19:41
下面是代码    function retPromise(str) {        return new Promise(resolve=>{            resolve(str);        })    }        console.log(retPromise("first")) // 返回一个Promise对象        retPromise("x").then(str=>{        return retPromise("first")    }).then(str=>{        console.log(str) // 返回"first"    })为什么在then中return Promise对象,在下一个then中被resolve了?第二个then的执行链是不是第二个Promise的?
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

Promise的思想就是把所有同步和异步的代码都视为异步代码,then方法内部会返回一个新的Promise(链式调用),then方法的第一个参数onfulfilled是在前一个Promise对象的异步调用完成之后调用的

    then(onfulfilled, onrejected){

            // 每个then方法都返回一个新的promise对象,实现链式调用


            return new Promise((resolve, reject)=>{


                let success = (value)=>{

                    // 这里执行onFulfilled,判断是否是promise对象并将返回结果作为参数传递到当前promise的reslove中

                    // 如果没有返回值,则默认返回原本的value值,这一步的处理并不是必须的

                    let result = onfulfilled(value) || value;

                    if (isThenable(result)){

                        result.then((value)=>{

                            resolve(value);

                        }, (value)=>{

                            reject(value);

                        });

                    }else {

                        resolve(result);

                    }

                }


                let error = (value)=>{

                    let result = onrejected(value) || value;

                    resolve(result);

                }

                

                // 当调用then方法的那个promise对象onfulfilled时调用success,执行上面的操作

                switch(this.status){

                    case PENDING:

                        this.onfulfilled = success;

                        this.onrejected = error;

                        break;

                    case FULFILLED:

                        success(this.value);

                        break;

                    case REJECTED:

                        error(this.reason);

                        break;

                }

                

            })

        }

这里还是牵扯到Promise构造函数内部的一些实现,刚好前几天实现了一个简单的Promise,这里是传送门,希望对您有所帮助

查看完整回答
反对 回复 2018-12-17
  • 1 回答
  • 0 关注
  • 3636 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号