自己实现最基础的promise

原创 自由小鸟  2019-12-02 20:54:32  阅读 1086 次 评论 0 条

没事自己手写了一下

let pi=new Promise((resolve,reject)=>{
    resolve(100);
    reject(0);
})
p1.then(result=>{
    console.log('成功'+result)
},reason=>{
    console.log('失败'+reason)
})
console.log('ok')

//打印出来是 
ok  
成功+100
class MyPromise{
    constructor(executor){
        //初始状态
        this.status='pending';
        this.value=undefined;

        //来控制执行resolve和reject的时候执行对应then里的函数方法
        this.resolveArr=[];
        this.rejectArr=[];

        //执行的改变状态的方法
        let changeStaus=(status,result)=>{
            if(this.status!=='pending') return;  //2,如果有一个执行了,下一个不会执行
                this.status=status;
                this.value=result;
                let arr=status==='rejected'?this.rejectArr:this.resolveArr
                //执行resolve函数
                arr.map(item=>{
                    if(typeof item==='function'){
                        item(this.value);
                    }
                })
        }
        //改变状态函数
        let resolve=(result)=>{
            if(this.resolveArr.length>0){
                changeStaus('resolved',result);
                return;
            }
            let delayTimer=setTimeout(()=>{
                clearTimeout(delayTimer);
                changeStaus('resolved',result);
            },0)


        };   //resolve(100)
        let reject=(reason)=>{
            if(this.rejectArr.length>0){
                changeStaus('rejected',reason);
                return;
            }
            let delayTimer=setTimeout(()=>{
                changeStaus('rejected',reason);
            },0)


        };    //reject('错误信息')

        //这里需要处理一下异常错误
        try{
            executor(resolve,reject); //执行函数
        }catch(error){
            reject(error)
        }

    }

    //添加方法
    then(resolveFn,rejectFn){
        this.resolveArr.push(resolveFn);
        this.rejectArr.push(rejectFn);
    }

}

module.exports=MyPromise;
本文地址:https://webge.net/?id=83
版权声明:本文为原创文章,版权归 自由小鸟 所有,欢迎分享本文,转载请保留出处!

评论已关闭!