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 篇原创文章 · 获赞 0 · 访问量 23
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览