ES6 Promise.then的源码(转载)

写源码可以了解一个函数的本质,通过对源码的理解可以让你对知识有更多的了解,欢迎大家留言交流学习。

 

 

function myPromise(fn){

            if(typeof(fn) !== 'function'){

                throw Error (`Promise resolver ${fn} is not a function`)

            }

            let _this=this;

            this.status="pending";

            this.data=null;

            this.resolvedArr=[];

            this.rejectedArr=[];

 

            function resolved(data){

                setTimeout(() => {

                    if(_this.status=='pending'){

                        _this.status = 'resolved';

                        _this.data = data;

                        _this.resolvedArr.forEach(function(fn){

                            return  fn();

                        })

                    }

                }, 0);

            }

            function rejected(err){

                setTimeout(() => {

                if (_this.status=='pending') {

                    _this.status = "rejected";

                    _this.data =err;   

                }

            }, 0);

            }

            fn(resolved,rejected);

        

        }

        myPromise.prototype.then=function(onResolved,onRejected){

            let _this = this;

            if(_this.status=='resolved'){

                return new myPromise(function(resolved,rejected){

                    let res= onResolved(_this.data)

                    if( res instanceof myPromise){  //判断res 是不是 myPromise的实例

                        res.then(resolved,rejected)

                    }else{

                        resolved(res);

                    }

                })

            }

            if(_this.status == 'rejected'){

                return new myPromise(function(resolved,rejected){

                    let res= onResolved(_this.data)

                    if( res instanceof myPromise){  //判断res 是不是 myPromise的实例

                        res.then(resolved,rejected)

                    }else{

                        resolved(res);

                    }

                })

            }

            if(_this.status == 'pending'){

                return new myPromise(function(resolved,rejected){

                  _this.resolvedArr.push((function (onResolved){

                      return function (){

                          var res = onResolved(_this.data)

                          if(res instanceof myPromise){

                              res.then(resolved,rejected)

                          }else{

                              resolved(res)

                          }

                      }

                  })(onResolved))

                _this.rejectedArr.push((function (onRejected) {

                            return function () {

                                var res = onRejected(_this.data)

                                if(res instanceof myPromise) {

                                    res.then(resolved, rejected)

                                } else {

                                    resolved(res)   

                                }  

                            }

                        } )(onRejected))

                })

            }

        }

        var p2=new myPromise(function(resolved,rejected){

            resolved('sasasa');

        });

        p2.then(function(data){

            console.log(data)

        },function(data){

            console.log(data)

        })

 

 

用class写promise源码

用class写promise源码

用class写promise源码

 

        class myPromise{

            constructor(fn){

                if(typeof(fn) !== 'function'){

                throw Error (`Promise resolver ${fn} is not a function`)

                }

                this.status="pending";

                this.data=null;

                this.resolvedArr=[];

                this.rejectedArr=[];

                let _this=this

                function resolved(data){

                    setTimeout(() => {

                        if(_this.status=='pending'){

                            _this.status = 'resolved';

                            _this.data = data;

                            _this.resolvedArr.forEach((fn)=>fn())

                        }

                    }, 0);

                }

                function rejected(err){

                    setTimeout(() => {

                    if (_this.status=='pending') {

                        _this.status = "rejected";

                        _this.data =err;   

                    }

                }, 0);

                }

                fn(resolved,rejected)

             }

            then(onResolved,onRejected){

                        let _this = this;

                    if(_this.status=='resolved'){

                        return new myPromise((resolved,rejected)=>{

                            let res= onResolved(_this.data)

                            if( res instanceof myPromise){  //判断res 是不是 myPromise的实例

                                res.then(resolved,rejected)

                            }else{

                                resolved(res);

                            }

                        })

                    }

                    if(_this.status == 'rejected'){

                        return new myPromise((resolved,rejected)=>{

                            let res= onResolved(_this.data)

                            if( res instanceof myPromise){  //判断res 是不是 myPromise的实例

                                res.then(resolved,rejected)

                            }else{

                                resolved(res);

                            }

                        })

                    }

                    if(_this.status == 'pending'){

                        return new myPromise((resolved,rejected)=>{

                        _this.resolvedArr.push(((onResolved)=>

                                 ()=>{

                                let res = onResolved(_this.data)

                                if(res instanceof myPromise){

                                    res.then(resolved,rejected)

                                }else{

                                    resolved(res)

                                }

                            

                        })(onResolved))

                        _this.rejectedArr.push(((onRejected)=> 

                                     ()=> {

                                        let res = onRejected(_this.data)

                                        if(res instanceof myPromise) {

                                            res.then(resolved, rejected)

                                        } else {

                                            resolved(res)   

                                        }  

                                    }

                                 )(onRejected))

                        })

                    }

            }   

        }


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值