Promise 实现解析

152 阅读1分钟

对Promise一直一知半解。今天看到之前写的笔记。突然理解了,记录一下~

` class Promise 代码

constructor(excutor){
    //实例化后接受promise括号内处理方法
    //调用处理方法,传入resolve和reject方法 使promise内部可以调用
    excutor(this.resolve,this.reject)
}
//记录状态值
status = PENDING
//存储成功消息
valuea = undefined
//存储失败消息
reason = undefined
//存储成功回调
successCallBack=[]
//存储失败回调
failCallBack=[]  

resolve(){
    if(this.status!==PENDING)return;
     //状态
    this.status = FULFILLED;
    //回调值 
    this.valuea = value;
    //如果回调存在  调用
    // this.successCallback = this.successCallback(value); 
    //多次调用  匿名函数调用
    while(this.successCallback.length) this.successCallback.shift()()   
}

reject(){
    //与resolve同理
}

//new Promsise().then 链式调用promise上的函数
//实例化后立即执行了then方法 接受then传入参数
then(successCallback,failCallBack){
    //判断当前回调是可执行数组还是值
    let promise2 = new Promise((resolve,reject)=>{
        //判断当前状态 成功 失败 等待
        //如果是成功的话
        if(this.status == FULFILLED){
            //调用传入回调处理函数 传入成功值
           let x = successCallback(this.valuea);
           //判断x是promise还是普通值 
           //如果是函数值 x.then 继续执行
           //如果是普通值 resolve(value)
            resolvePromise(promise2,x,resolve,reject);
        }else if(this.status == REJECTED){
        }else{
            //如果是等待,将成功回调和失败回调都存储起来
            this.successCallback.push(()=>{
                //异步 setTimeout
                //成功回调
                 let x = successCallback(this.valuea);
                 //判断值是promise还是普通值
                 resolvePromise(promise2,x,resolve,reject);
            };
            this.failCallback.push(()=>{
                //异步 setTimeout
                //成功回调
                 let r = failCallback(this.reason);
                 //判断值是promise还是普通值
                 resolvePromise(promise2,x,resolve,reject);
            }
        }   
    })
} 

//判断执行后参数是普通值还是promise

resolvePromise 函数 传入参数 promise2,x,resolve,reject

if(promise2 === x){
    reject(new TypeError('Chaining cycle detected for promise #'))
}
if(x instanceof MyPromise){
    //promise 对象
    //x.then(value=>resolve(value),reason=>reject(reson))
    x.then(resolve,reject)
}else{
    //普通
    resolve(x)
}

`