手写promise,其原理实现是基于promise的特点,实现相对复杂,需要循序渐进,从简单到复杂。首先你要知道promise有什么特点。letpromise=newPromise((resolve,reject)=>{resolve('success');//reject("failed");})promise.then((value)=>{},(reason)=>{});最简单的一种使用方式,以new关键字开头,表示promise是一个类。类在执行时,需要传递一个执行器,它会立即执行。它有两个参数,一个是resovle,一个是reject。它实际上是两个函数。Promise有三种状态,fulfilled(成功),rejected(失败)和pending(等待)。通过pending->fulfilled或pending->rejected。状态一旦确定,就不能改变,resovle和reject用于改变状态。promise中有一个then方法,定义在prototype对象中。它用于判断状态。如果成功,它会执行成功后应该做的事情。如果失败,它将执行失败后应该做的事情。并且有参数表示成功后的值或者失败的原因。所以Promise至少有以下四个特点。Promise是一个类,在执行这个类的时候,需要传入一个executor,由executor立即执行。Promise中有3个状态。状态一经确认,不可更改。resovle和reject函数是用来改变then方法的状态来判断状态的。如果状态为成功,则调用成功回调函数。如果状态为失败,则调用失败回调函数。then方法定义在原型对象中。然后success回调有一个参数表示成功后的值,然后failure回调有一个参数根据以上特点,实现代码如下://定义三种状态constPENDING='pending';//等待constFULFILLED='fulfilled';//成功constREJECTED='rejected';//失败类MyPromise{constructor(executor){executor(this.resolve,this.reject);}//定义一个变量status=PENDING;//定义两个实例属性,分别表示成功后的值和失败后的原因value=undefined;原因=未定义;//两个属性,这里定义为箭头函数,因为我们在使用的时候直接调用它们,//而普通函数中的this指向window或者undefined,定义为箭头函数是为了在函数内部使用,this指向classinstanceobjectresolve=value=>{//如果状态不是等待,则阻止程序继续往下执行if(this.status!==PENDING)return//将状态改为成功this.status=FULFILLED//保存成功值this.value=value;}reject=reason=>{//如果状态不是等待Pending,防止程序宕机}then(successCallback,failedCallback){//状态判断if(this.status===FULFILLED){successCallback(this.value)}elseif(this.status===REJECTED){failedCallback(this.reason)}}}module.exports=MyPromise;测试代码:constMyPromise=require('./mypromise');letpromise=newMyPromise((resolve,reject)=>{//resolve('---success----');reject("---failed----");})promise.then(value=>{console.log(value);},reason=>{console.log(reason)})测试成功
