当前位置:首页 > ES6 > 正文内容

自己实现最基础的promise

自由小鸟4年前 (2019-12-02)ES62162

没事自己手写了一下

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;

版权声明:本文由Web学习之路发布,如需转载请注明出处。

本文链接:https://webge.net/?id=83

返回列表

上一篇:精选之Promise

没有最新的文章了...

“自己实现最基础的promise” 的相关文章

es6 作用域

作用域 let  constconst定义是常量不可修改,除引用外1,let声明的变量只有在块作用域是{}里可以访问,之外就不可访问2,使用let不可以重复定义变量3,代码用了es6是强制作用了严格模式的,在es5是开启严格模式“use strict”,在es6中不用这种话,4,在严格模式...

es6 解构的使用场景

二,解构{    let a,b,rest;    [a,b]=[1,2]    console.log(a,b);  // 1 2}{   ...

es6 函数扩展

参数默认值rest参数扩展运算符箭头函数this绑定尾调用// 参数默认值{    function test(x,y='world'){        conso...