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

实现Promise的详细过程(实现一个最全的Promise构造函数)

时间:2023-04-03 17:55:26 Node.js

1.创建promise构造器基本架构getstatusstatus='pending'initialize'resolved'get'rejected'getfailedinitialdatadata=undefineddefinesuccess/failurecallbackfunctioncontaineronResolved=undefinedonRejected=undefineddefinesuccess/failurefunctionresolve/reject内部_this.status改变状态为acquired/failed_this.data保存成功/失败数据。如果定义了成功/失败回调函数,则立即异步执行成功/失败回调执行器执行成功/失败函数resolve/reject如捕获到异常,则表示thenreturnpromise的结果是失败执行reject,并传入错误。2.定义构造函数原型然后函数,在onResolved/onRejected上接收成功/失败回调,最后返回一个新的promise实例。定义returnpromise结构体,接收Success/failure函数参数,returnpromise的执行结果由onResolved决定,onRejectedreturnpromise定义DealWithThenReturnPromise(returnpromise状态处理函数)并接受then的成功/失败回调====>onResolved,onRejected有3种结果情况改变returnpromise的状态执行结果是异常抛出,执行returnpromise的失败函数,传入异常数据。执行结果是一个promise实例。returnpromise是否执行调用成功/失败函数取决于promise的执行结果。执行结果不是promise实例,执行returnpromise的success函数,并传入执行结果执行then传入的成功/失败回调,将返回值保存为resultresult执行result的then方法instance为Promise的实例,并传入成功/失败回调返回promise的成功/失败函数结果不是promise实例执行returnpromise成功函数,传入resultresult执行结果是异常抛出catch异常并执行返回承诺失败函数Number,传入errorreturnpromise定义三种数据获取状态处理方法====>数据获取分三种情况,每种状态都要异步执行。数据获取成功,表示可以直接执行,获取onResolved返回值数据失败,表示可以直接执行,没有获取到onRejected的返回值数据,表示o??nRejected和onResolved不能立即执行,需要保存在实例中,由执行者的回调函数执行。函数,并传入成功回调函数数据获取失败执行返回promise状态处理函数,并传入失败回调函数数据尚未获取封装成功/失败函数,执行封装中返回promise状态处理函数函数,并传入thensuccess/failurecallback这个封装函数最终由当前promise实例的success/callback函数执行,最终由returnpromise状态处理函数处理3.定义Promise.resolvePromise.resolve接收三种类型的参数并返回一个新的promise实例,成功的Promise实例的失败的Promise实例不是Promise实例的任意值。Promise成功函数,并传入参数4.定义Promise.allPromise.all接收Promise或其他值数组。如果全部成功,执行returnpromise,传入Promise的成功结果。只要一个失败,就执行失败的returnPromise,传入失败的值Promise.allreturnpromise架构定义了一个数组容器定义了一个计数器遍历数组(forEach),每次进入循环计数器+1然后执行每个promise实例,成功则根据下标将值存入数组容器判断promise数组长度是否等于计数器。如果相等,说明需要执行returnpromise的success函数。如果then执行失败,然后直接调用returnpromisefailure函数,传入thenfailure值5。定义promise.rulePromise.rule接收一个Promise或者其他值的数组。如果成功/失败,直接调用returnpromise成功/失败函数实现具体代码//!定义公共常量//?未获取,表示当前promise的解析是异步完成的。constPENDING='待定'//?Acquired,表示当前的promise是同步执行的。constRESOLVED='已解决'//?当前promise的执行结果是failureconstREJECTED='rejected'//!这三种状态只能从pendingfunctionPromise(executor){const_this=this//!Promise构造函数将初始化状态定义为未获取状态_this.status=PENDING//!Promise构造函数将初始化数据定义为undefined_this.data=undefined//!Promise构造函数定义初始化成功容器为undefined_this.onResolved=undefined//!Promise构造函数将初始化失败容器定义为undefined_this.onRejected=undefined//!获取成功函数functionresolve(value){//!如果状态不是pending,那么直接returnif(_this.status!==PENDING){return}//!更改状态以获得成功_this.status=RESOLVED//!保存数据_this.data=value//!如果已经定义了success函数,说明成功回调onResolved需要异步执行,需要传入数据if(_this.onResolved){setTimeout(()=>_this.onResolved(值));}}//!获取失败函数functionreject(reason){//!如果状态不是pending,那么直接returnif(_this.status!==PENDING){return}//!更改状态获取失败_this.status=REJECTED//!保存数据_this.data=reason//!如果定义了失败函数,则意味着失败回调onResolved需要异步执行并传入数据}}try{executor(resolve,reject)}catch(error){//!如果捕获到错误,则表示thenreturnpromise的结果Forfailure//!然后直接调用retrunpromise的失败函数,将失败的reject(error)传递下去}}Promise.prototype={then:function(onResolved,onRejected){//!onResolved成功回调;onRejected失败回调;const_this=这个//!执行then时,返回一个新的promise//!returnpromise的执行结果由onResolved,onRejected决定returnnewPromise((resolve,reject)=>{/*!----->data获取会发生三种情况!数据已经被如果获取成功,则代表可以直接执行并获取onResolved的返回值!如果数据获取失败,则意味着可以直接执行并获取onRejected的返回值!如果没有获取到数据,则说明onRejected和onResolved不能立即执行,必须在要执行的实例中存储设备的回调函数执行!----->并且每个状态都必须异步执行*/if(_this.status===RESOLVED){//!数据获取成功,执行returnpromise状态处理函数,并传入成功回调setTimeout(()=>DealWithThenReturnPromise(onResolved));}elseif(this.status===REJECTED){//!数据获取失败,执行returnpromise状态处理函数,传入失败回调setTimeout(()=>DealWithThenReturnPromise(onRejected));}别的{//!还未获取到数据,封装成功/失败函数,在封装函数中执行returnpromise状态处理函数,传入then成功/失败回调,//!这个封装函数最终由当前promise实例的成功/回调函数执行//!获取数据时会在DealWithThenReturnPromise函数中获取_this.onResolved=value=>DealWithThenReturnPromise(onResolved)_this.onRejected=reason=>DealWithThenReturnPromise(onRejected)}//!定义返回promise处理函数,传入待处理的success|failure函数functionDealWithThenReturnPromise(callback){/*!onResolved,onRejected改变返回承诺的状态有3种结果情况!returnpromise的失败函数,并传入异常数据!执行结果是一个promise实例,是否调用返回promise的成功/失败函数由执行结果的promise结果决定!执行结果不是promise实例,执行returnpromise的success函数,并传入执行结果*/try{//!保存then的成功/失败返回值constresult=callback(_this.data)if(resultinstanceofPromise){//!执行结果为promise实例,执行结果为promise实例判断returnpromise的执行结果//!通俗易懂的写法result.then(value=>resolve(value),reason=>reject(reason))//!简单的措辞result.then(resolve,reject)//!这里将returnpromise的成功/失败回调传递给执行结果实例,所以这里的resolve有两层意思,//!一个是result实例的onResolved和onRejected然后,//!另一个是returnpromise的resolve和reject}else{//!执行结果不是promise实例,执行返回promise成功函数,传入执行结果resolve(result)}}catch(error){//!执行结果是抛出异常,捕获异常并执行returnpromise失败函数,传入异常reject(error)}}})},catch:function(reject){returnthis.then(null,reject)},}Promise.resolve=function(value){/*!Promise.resolve接收三个参数!1.实例结果失败!2.实例结果成功!3.不是实例*/returnnewPromise((resolve,reject)=>{if(valueinstanceofPromise){//!如果值是Promise的实例value.then(resolve,reject)}else{//!如果不是resolve(value)}})}Promise.reject=function(reason){returnnewPromise((resolve,reject)=>{reject(reason)})}Promise.all=function(promises){//!创建一个计数器letresolveCount=0//!创建指定长度的数组constvalues=newArray(promises.length)returnnewPromise((resolve,reject)=>{promises.forEach((item,index)=>{Promise.resolve(item).then(value=>{//!当获取成功时,计数器+1resolveCount++//!promise实例成功,将结果保存在数组中values[index]=value//!当最后一个被执行时,执行全部返回promise成功函数,传入数组promises.length===resolveCount?resolve(values):[]},//!只要一个失败,返回的promise全部失败reason=>reject(reason))})})}Promise.rule=function(promises){returnnewPromise((resolve,reject)=>{promises.forEach(item=>{Promise.resolve(item).then(resolve,reject)})})}