ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

手写Promise

2021-07-10 10:52:18  阅读:244  来源: 互联网

标签:function resolve reason MyPromise state Promise reject 手写



<script>
    const PENDING="pending";
    const FULFILLED = "fulfiled";
    const REJECTED = "rejected";
    function MyPromise(fn){
        let _this=this;
        _this.state=PENDING;
        _this.value="";
        _this.reason="";
        _this.fulfilledFnArr=[];
        _this.rejectedFnArr=[];
        function resolve(value){
            _this.state=FULFILLED;
            _this.value=value;
            _this.fulfilledFnArr.forEach((item)=>{
                item();
            })
        }
        function reject(reason){
            _this.state=REJECTED;
            _this.reason=reason;
            _this.rejectedFnArr.forEach((item)=>{
                item()
            })
        }
        fn(resolve,reject)
    }

    MyPromise.prototype.then=function(onFulfilledFn,onRejectedFn){
        var _this=this;



        // 针对同步方法
        if(_this.state==FULFILLED){
            console.log("----FULFILLED---")
            return new MyPromise(function(resolve,reject){
                var x = onFulfilledFn(_this.value);
                if(x instanceof MyPromise){
                    x.then(resolve,reject)
                }else{
                    resolve(x)
                }
            })
            
        }
        if(_this.state==REJECTED){
            return new MyPromise(function(resolve,reject){
                var x =  onRejectedFn(_this.reason);
                if(x instanceof MyPromise){
                    x.then(resolve,reject)
                }else{
                    resolve(x)
                }
            })
        }
        // 针对异步方法
        if(_this.state==PENDING){
            return new MyPromise(function(resolve,reject){
            console.log("----PENDING---")
            _this.fulfilledFnArr.push(()=>{
                    var x = onFulfilledFn(_this.value);
                    if(x instanceof MyPromise){
                        x.then(resolve,reject)
                    }else{
                        resolve(x)
                    }
            });
            _this.rejectedFnArr.push(()=>{
                    var x =  onRejectedFn(_this.reason);
                    if(x instanceof MyPromise){
                        x.then(resolve,reject)
                    }else{
                        resolve(x)
                    }
                })
            })
        }
    }



    new MyPromise(function(resolve,reject){
        setTimeout(() => {
            resolve(333)
        }, 5000);
    }).then(function(res){
        console.log(res)
        return new MyPromise(function(resolve,reject){
            setTimeout(() => {
                resolve(8888)
            }, 2000);
        })
    }).then(function(res){
        console.log(res)
    })
    


</script>

 

标签:function,resolve,reason,MyPromise,state,Promise,reject,手写
来源: https://blog.51cto.com/u_11641800/3034057

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有