首先看一下Promise代码:
let promise =new Promise((resolve,reject)=>{resolve('成功');//reject('失败');
})
promise.then(val=>{console.log(val);
},reason=>{console.log(reason);
})
我们根据以上的一个简单的用例,得到Promise类的最主要的核心逻辑,分为以下几个方面:
- Promise 是一个类,在执行这个类的时候,需要传递一个执行器,声明实例的时候,执行器会立刻执。
- Promise 中有三种状态 pending等待(默认) fulfilled成功 rejected失败 三种状态关系: fulfilled <= pending => rejected 一旦状态改变就不可更改。
- resolve与reject函数是用来更改状态的。 resolve:fulfilled reject:rejeceted
- then方法内部做的事情就是判断状态,如果状态是成功,调用成功的回调函数,如果状态失败,调用失败的回调函数。
- then成功回调一个参数,表示成功之后的值 ;then失败回调一个参数,表示失败后的原因。
根据以上得到的部分结论,我们可以实现以下代码:
//常量定义三种状态 以防拼错与进行代码提示。
const PENDING='pending';
const FULFILLED='fulfilled';
const REJECTED='rejected';class MyPromise{//执行器constructor(executor){//当前函数this指定MyPromise对象this.resolve=this.resolve.bind(this);this.reject=this.reject.bind(this);//默认状态this.status=PENDING;//成功返回数据this.value=undefined;//失败返回原因this.reason=undefined;//执行执行器executor(this.resolve,this.reject);}//成功执行时的方法resolve(value){//因为状只能是pending=> fulfilled/rejected 如果其他状态就返回if(this.status!==PENDING) return;//执行之后状态更改为fulfilledthis.status=FULFILLED;//把成功返回值保存在变量里边this.value=value;}//失败执行方法reject(reason){if(this.status!==PENDING) return;this.status=REJECTED;//把失败返回值保存在变量里边this.reason=reason;}//then方法执行then(sucessCallback,failCallback){//判断状态 来调用回调函数switch(this.status){case FULFILLED:sucessCallback(this.value);break;case REJECTED:failCallback(this.reason);break;default:break;}}
}
我们可以调用MyPromise类来实现文章开头代码所展示的功能。
let promise=new MyPromise((resolve,reject)=>{//resolve('成功');reject('失败');
});
promise.then(val=>{console.log(val);
},reason=>{console.log(reason);
})
目前我们只实现了一个简单的同步调用逻辑,如果代码中有异步操作,需要怎么实现呢?
let promise=new MyPromise((resolve,reject)=>{setTimeout(() => {resolve('成功');}, 1000);//reject('失败');
});
promise.then(val=>{console.log(val);
},reason=>{console.log(reason);
})
请看下篇文章
李先生:二.Promise中异步逻辑的实现zhuanlan.zhihu.com