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

自己实现最基础的promise

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

没事自己手写了一下

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://www.webge.net/?id=83

返回列表

上一篇:精选之Promise

没有最新的文章了...

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

es6 Symbol

es6 Symbol

Symbol是js 提供了独一无二的值let a1=Symbol();let a2=Symbol();console.log(a1===a2)   //falselet a3=Symbol.for('a3');let a4=Symbol.for('a3&#...

es6 promise

es6 promise

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

精选之Promise

我们从promise是什么怎么会出现来一步步解决问题来深入了解1、了解 Promise 吗? 2、Promise 解决的痛点是什么? 3、Promise 解决的痛点还有其他方法可以解决吗?如果有,请列举。 4、Promise 如何使用? 5、Promise 常用的方法有哪些?它们的作用是什么...