本文转载自微信公众号《三分钟学会前端》,作者安姐。转载本文请联系三分钟学习前端公众号。简介本文从五个方面介绍Promise.any:Promise.any的作用Promise.any应用场景Promise.anyvsPromise.allPromise.anyvsPromise.race手写Promise.any实现如下文字启动Promise.anyPromise.any()是ES2021的新特性。它接收一个Promise可迭代对象(比如数组),只要其中一个promise成功,它就返回成功的promise。如果可迭代对象中的任何承诺都没有成功(即所有承诺失败/拒绝),则返回一个失败的承诺和一个AggregateError类型的实例,它是用于将单个错误聚合在一起的错误的子类constpromises=[Promise.reject('ERRORA'),Promise.reject('ERRORB'),Promise.resolve('result'),]Promise.any(promises).then((value)=>{console.log('value:',value)}).catch((err)=>{console.log('err:',err)})//value:resultifallincomingpromisesfail:constpromises=[Promise.reject('ERRORA'),Promise.拒绝('错误'),承诺。reject('ERRORC'),]Promise.any(promises).then((value)=>{console.log('value:',value)}).catch((err)=>{console.log('err:',err)console.log(err.message)console.log(err.name)console.log(err.errors)})//err:AggregateError:Allpromiseswererejected//Allpromiseswererejected//AaggregateError//["ERRORA","ERRORB","ERRORC"]Promise.any应用场景从最快的服务器获取资源。来自世界各地的用户访问该网站。如果您有多个服务器,请尝试使用响应最快的服务器,在这种情况下,可以使用Promise.any()方法functiongetUser(endpoint){returnfetch(`https://superfire.${endpoint}.com/users`).then(response=>response.json());}constpromises=[getUser("jp"),getUser("uk"),getUser("us"),getUser("au"),getUser("in")]Promise.any(promises).then(value=>{console.log(value)}).catch(err=>{console.log(err);})显示第一个加载图像(来自MDN)在这个例子中,我们有一个获取图像并返回blob的函数,我们使用Promise.any()来获取一些图像并显示第一个有效图像(承诺首先解析)functionfetchAndDecode(url){returnfetch(url).then(response=>{if(!response.ok){thrownewError(`HTTPerror!status:${response.status}`);}else{returnresponse.blob();}})}letcoffee=fetchAndDecode('coffee.jpg');lettea=fetchAndDecode('tea.jpg');Promise.any([coffee,tea]).then(value=>{letobjectURL=URL.createObjectURL(valUEe);letimage=document.createElement('img');image.src=objectURL;document.body.appendChild(image);}).catch(e=>{console.log(e.message);});Promise.anyvsPromise.allPromise.any()和Promise.all()从返回结果来看,它们是相反的:Promise.all():任何被拒绝的promise都会被立即拒绝,被拒绝的是第一个抛出的错误信息,只有当所有的promise都被resolved时才会resolvedallresultsPromise.any():任何被resolved的promise都会被立即resolved,被resolved的是第一个正确的结果,只有所有的失败消息都是rejectedwhenallpromisesreject此外,它们有不同的侧重点:Promise.all()对所有fulfillments感兴趣相反的情况(至少一个拒绝)导致拒绝。Promise.any()对第一个实现感兴趣。相反的情况(全部拒绝)导致拒绝。Promise.anyvsPromise.racePromise.any()和Promise.race()有不同的关注点:Promise.any():关注Promise是否已经解决Promise.race():主要关注Promise是否已经解决,不管是resolved还是rejectedHandwrittenPromise.any实现Promise.any只要传入的promise有一个fullyfilled,就会立即resolve,否则会收集所有rejection结果并返回AggregateErrorMyPromise.all=function(promises){returnnewPromise((resolve,reject)=>{promises=Array.isArray(promises)?promises:[]letlen=promises.length//用来收集所有rejectleterrs=[]//如果传入空数组,然后直接返回AggregateErrorif(len===0)returnreject(newAggregateError('Allpromiseswererejected'))promises.forEach((promise)=>{promise.then(value=>{resolve(value)},err=>{len--errs.push(err)if(len===0){reject(newAggregateError(errs))}})})})}来自:https://github.com/sisterAn/blog
