当前位置: 首页 > 后端技术 > Node.js

手写Promise,1.8promise实现完整代码

时间:2023-04-03 21:12:13 Node.js

完整代码如下://定义三种状态constPENDING='pending';//等待constFULFILLED='fulfilled';//成功constREJECTED='rejected';//失败类MyPromise{constructor(executor){try{executor(this.resolve,this.reject);}catch(e){this.reject(e)}}//定义一个属性status=PENDING;//定义两个实例属性,分别表示成功后的值和失败后的原因value=undefined;原因=未定义;//成功回调successCallback=[];//失败回调failedCallback=[];//两个属性,这里定义为箭头函数,因为我们使用的是直接调用,//而普通函数内部的this指向window或者undefined,定义为箭头函数,使得函数内部的this指向类实例对象resolve=value=>{//如果状态不是等待,则阻止程序向下进行if(this.status!==PENDING)return//改变状态为成功this.status=FULFILLED//保存成功值this.value=value;//判断成功回调是否存在,存在则调用//this.successCallback&&this.successCallback(this.value);while(this.successCallback.length){this.successCallback.shift()();}}reject=reason=>{//如果状态不是等待,阻止程序继续下去if(this.status!==PENDING)return//改变状态为失败this.status=REJECTED//Reasonfor保存失败这个。原因=原因;//判断失败回调是否存在,存在则调用//this.failedCallback&&this.failedCallback(this.reason);while(this.failedCallback.length){this.failedCallback.shift()();}}then(successCallback,failedCallback){//可选参数successCallback=successCallback?成功回调:价值=>价值;失败回调=失败回调?failedCallback:原因=>{抛出原因};letpromise2=newPromise((resolve,reject)=>{//状态判断if(this.status===FULFILLED){setTimeout(()=>{try{//定义成功回调返回值,传给接下来的成功回调letsuccessRtn=successCallback(this.value);//判断x的值是普通值还是promise对象//如果是普通值,直接调用resolve//如果是promise对象,检查promsie对象返回的结果//然后判断是否根据promise对象返回的结果调用resolve或reject//执行resolve方法相当于将返回值传递给下一个成功回调函数thenresolvePromise(promise2,successRtn,resolve,reject);}抓住(e){拒绝(e);}},0);}elseif(this.status===REJECTED){setTimeout(()=>{try{letfailedRtn=failedCallback(this.reason);resolvePromise(promise2,failedRtn,resolve,reject);}catch(e){reject(e)}},0);}else{//等等,需要保存成功回调和失败回调,需要执行的时候执行this.successCallback.push(()=>{)setTimeout(()=>{try{letsuccessRtn=successCallback(this.value);resolvePromise(promise2,successRtn,resolve,reject);}catch(e){reject(e);}},0);});this.failedCallback.push(()=>{setTimeout(()=>{try{letfailedRtn=failedCallback(this.reason);resolvePromise(promise2,failedRtn,resolve,reject);}catch(e){reject(e)}},0);});}});回报承诺2;};catch(failCallback){this.then(undefined,failCallback)};最后(回调){返回this.then(value=>{returnMyPromise.resolve(callback()).then(()=>value);},reason=>{returnMyPromise.resolve(callback()).then(()=>{throwreason})})};静态所有(数组){让??结果=[];//用于判断当前执行值是否等于数组长度,相等时才执行resolve()letidx=0;returnnewMyPromise((resolve,reject)=>{//添加元素方法functionaddElement(index,value){result[index]=value;idx++;if(idx===array.length){resolve(result)}}for(leti=0;iaddElement(i,value),reason=>reject(reason))}else{//普通值addElement(i,array[i]);}}})}staticrace(array){returnnewMyPromise((resolve,reject)=>{for(leti=0;iresolve(e))}}}functionresolvePromise(promise2,e,resolve,reject){if(promise2===e){returnreject(newTypeError("Chainingcycledetectedforpromise#"))}if(einstanceofMyPromise){//promise对象//e.then((value)=>{//resolve(value)//},(reason)=>{//reject(reason)//})//简化代码e.then(resolve,reject);}else{//普通值resolve(e);}}module.exports=MyPromise;