当前位置: 首页 > Web前端 > JavaScript

Promise方法的实现

时间:2023-03-27 16:16:46 JavaScript

Promisefinally这是Promise实例原型链上的一个方法Promise.prototype.finally=function(func){returnthis.then((value)=>{Promise.resolve(func()).then(()=>value)},(reason)=>{Promise.resolve(func()).then(()=>{throwreason})})}Promise.Allif(!arr[Symbol.iterator])throw'参数不可迭代';常量promiseArr=Array.from(arr).map(a=>{if(ainstanceofPromise){returna;}else{returnPromise.resolve(a);}})if(promiseArr.length===0)返回Promise.resolve([]);returnnewPromise((resolve,reject)=>{letresult=[];letcount=promiseArr.length;promiseArr.forEach((p,i)=>{p.then((res=>{result[i]=res;count--;if(count===0)resolve(result);},(reason)=>reject(reason)))})})点入参必须是可迭代参数转换成数组,并且所有项目都必须转换为Promise。返回值始终是Promise输入参数。如果长度为0,则直接返回Promise.resolve([])否则Promise.all([])返回的promise一直处于pending状态Promise.raceconstPromiseRace=(arr)=>{if(arr[Symbol.iterator]===undefined)returnPromise.reject('paramisnotiterator')constpromiseArr=Array.from(arr).map(a=>{if(ainstanceofPromise){returna;}else{returnPromise.resolve(a);}})returnnewPromise((resolve,reject)=>{promiseArr.forEach((p,i)=>{p.then((res=>{resolve(res);},(reason)=>reject(reason)))})})}注意Promise.race([])返回的应是一个未决状态的promisePromise.anyconstPromiseAny=(arr)=>{if(arr[Symbol.iterator]===undefined)returnPromise.reject('paramisnotiterator')constpromiseArr=Array.from(arr).map(a=>{if(ainstanceofPromise){returna;}else{returnPromise.resolve(a);}})if(promiseArr.length===0)returnPromise.reject(newAggregateError([],'所有承诺都被拒绝'))returnnewPromise((resolve,reject)=>{consterrors=[];constcount=promiseArr.length;promiseArr.forEach((p,i)=>{p.then((res=>{resolve(res);},(reason)=>{errors[i]=reason;count--;if(count===0){reject(newAggregateError(errors,'Allpromiseswererejected'))}}))})})}注意Promise.any返回的错误一定是AggregateError类型的Promise.allSettledconstPromiseAllSettled=(arr)=>{if(arr[Symbol.iterator]===undefined)returnPromise.reject('paramisnotiterator')constpromiseArr=Array.from(arr).map(a=>{if(ainstanceofPromise){返回a;}else{returnPromise.resolve(a);}})if(promiseArr.length===0)returnPromise.resolve([])returnnewPromise((resolve,reject)=>{常量结果=[];constcount=promiseArr.length;promiseArr.forEach((p,i)=>{p.then((res=>{result[i]={status:'fulfilled',value:res};count--;如果(计数===0){resolve(result)}},(reason)=>{result[i]={status:'rejected',reason:reason};数数-;if(count===0){resolve(result)}}))})})}返回内容的格式必须是{status:'fulfilled',value:res}或者{status:'rejected',reason:原因}