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

自己实现最基础的promise

自由小鸟6年前 (2019-12-02)ES63036

没事自己手写了一下

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” 的相关文章

js 数据保护

js 数据保护

es3的写法利用构造函数闭包来实现属性不可编辑es5的写法用一个defineProperty 来实现只可读 writable:falsees6的实现,代理new Proxy来实现,思想和es3很像,操作是代理对象person...

es6 解构的使用场景

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

es6数值扩展

Number.isFinite    函数用于检查其参数是否是无穷大es6 只对数字操作,如果不是数字就返回falseisFinite(25) // true Number.isFinite(25) // trueisFinite("25"...

es6 语法

es6 语法

数据结构set的用法    weakSet的用法   Map的用法   weakMap的用法set用法{    let list=new Set()    li...

es6 类

类的概念(基本语法,继承关系,静态方法,表态属性)类还提供了getter  setter{//基本定义和生成实例class Parent{constructor(name='mukewang'){this.name=name;}}}{//继承class Parent{con...

es6 promise

es6 promise

Promise是为解决什么问题而产生的?promise是为解决异步处理回调金字塔问题而产生的Promise的两个特点1、Promise对象的状态不受外界影响1)pending 初始状态2)resolve 成功状态3)reject 失败状态Promise 有以上三种状态,只有异步操作的结果可以决定当前...