问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Promise.race()原理解析及使用指南

发布网友 发布时间:2024-10-01 11:02

我来回答

1个回答

热心网友 时间:2024-10-23 09:19

前言

Promise对象是ECMAScript6中新增的对象,主要将JavaScript中的异步处理对象和处理规则进行了规范化。本文介绍Promise中的Promise.race(Promises)方法,顾名思义就是赛跑的意思,Promise.race([p1,p2,p3])里面promise数组那个执行完成得快就获取那个的结果,不管结果本身是成功履行状态还是失败拒绝状态,只输出最快的promise。

下面来看看Promise.race()是如何工作的。

1.工作原理

Promise.race()返回一个promise,一旦迭代器中的某个promise履行或拒绝,返回的promise就会履行或拒绝。

函数接受一个promise数组(或通常是一个可迭代的)作为参数,如下:

constracePromise=Promise.race(promises);

当所有输入promises中有一个promise快速被履行或拒绝时,racePromise就会解析快速完成的promise结果(履行或拒绝):

可以使用then方法提取racePromise的结果:

racePromise.then((fastValue)=>{fastValue//快速完成的promise});

也可以使用async/await语法:

constfastPromise=awaitracePromise;fastPromise;//快速完成的promise

Promise.race()返回的承诺和最先完成的承诺信息一致。

Promise.race()和Promise.any()的不同:Promise.race()承诺列表中寻找第一个履行或拒绝的承诺;Promise.any()是从承诺列表中查找第一个履行的承诺。

2.使用指南

现在来深入介绍Promise.race()的使用之前,同样先来定义2个简单的函数。

functionresolveTimeout(value,delay){returnnewPromise((resolve)=>setTimeout(()=>resolve(value),delay));}functionrejectTimeout(reason,delay){returnnewPromise((r,reject)=>setTimeout(()=>reject(reason),delay));}

接下来使用上面定义的2个辅助函数来试试Promise.race()。

2.1完成所有promises

下面定义了一个promise数组racePromise,所有的promise都能够成功的resolve值,如下:

constfruits=["potatoes","tomatoes"];constvegetables=["oranges","apples"];constracePromise=Promise.race([resolveTimeout(fruits,5000),resolveTimeout(vegetables,1000),]);//等待1秒...constlist=async()=>{try{constfastPromise=awaitracePromise;console.log(fastPromise);}catch(error){console.log(error);}};list();//['oranges','apples']

从上面执行的结果来看Promise.race()返回最快履行的promise的resolve结果。

2.2一个promise被rejected

将上面第一个promise出现异常被rejected,如下代码:

constfruits=["potatoes","tomatoes"];constracePromise=Promise.race([resolveTimeout(fruits,2000),rejectTimeout(newError("Vegetablesisempty"),1000),]);//等待1秒...constlist=async()=>{try{constfastPromise=awaitracePromise;console.log(fastPromise);}catch(error){console.log(error);}};list();//Error:Vegetablesisempty

从上面的结果看,最先完成的promise被rejected,那么fastPromise返回的promise也是被rejected。

下面将rejected的承诺时间延长到5秒,如下:

constfruits=["potatoes","tomatoes"];constracePromise=Promise.race([resolveTimeout(fruits,2000),rejectTimeout(newError("Vegetablesisempty"),5000),]);//等待2秒...constlist=async()=>{try{constfastPromise=awaitracePromise;console.log(fastPromise);}catch(error){console.log(error);}};list();//['potatoes','tomatoes']

从上面执行结果看到,最快完成的promise履行了resolve,那么fastPromise返回的promise也是履行了resolve。

2.3所有promises被rejected

将上面所有的promises出现异常被rejected,如下代码:

constracePromise=Promise.race([rejectTimeout(newError("Fruitsisempty"),2000),rejectTimeout(newError("Vegetablesisempty"),1000),]);//等待1秒...constlist=async()=>{try{constfastPromise=awaitracePromise;console.log(fastPromise);}catch(error){console.log(error);}};list();//Error:Vegetablesisempty

从结果来看,虽然两个承诺都被拒绝了,fastPromise返回的promise是最快被拒绝的。

3.使用场景3.1.性能测试

在有异步操作的项目中,在对于网络或数据库请求进行性能进行优化的时候,可以使用Promises来测试其优化效果,通过使用Promise.race()来测试两种不同的方法的响应速度。

3.2最佳选择

例如获取同一类型的数据有多个请求服务器,同时向多个服务器发送请求,只要其中一个完成工作,就将其数据呈现,达到选择最佳线路的效果。这是可以使用Promise.race()同时执行promise并在第一个成功后立即完成。

总结

文章介绍了Promise.race()原理和使用,另外增加了2个可能用得到的场景,而Promise.race()和Promise.any()之间的基本区别在于,Promise.race()为第一个已解决和已拒绝的promise执行回调函数,而Promise.any()为第一个已履行的promise执行回调函数,如果没有履行的promise则拒绝一个特殊属性AggregateError。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我更新了win7QQ拼音在游戏上(剑侠情缘2)不能打字?打出来的都是... 游漓江的船票在哪里买最方便?如何去 因为我想看剑侠情缘,又不想下载什么PPS啊,QQ直播之类软件, 最好是类似... ...两部手机下载相同的手游剑侠情缘却是不一样的都是在QQ上下载的 教子小书坊:一位外交官父亲给孩子的家书图书信息 教子小书坊:一位外交官父亲给孩子的家书内容简介 高二孩子和家长逆反如何教育 高二孩子和家长逆反怎么办 叛逆期孩子怎么教育沟通叛逆期孩子如何教育沟通 请问用otg连接鼠标和键盘后怎么玩手机上的全民枪战,求教程。带图的给... 去邮局寄包裹的步骤是怎么样?我没去做.不好意思问下大家 Promise原理解析,你值得拥有 Promise.any()原理解析及使用指南 Promise.allSettled()原理解析及使用指南 雅漾修颜抚纹眼霜的去皱效果怎么样? 有哪些好用的去皱眼霜? 平安线下有什么贷款 平安贷款什么流程 网络犯罪常见罪名有哪些 苹果笔记本如何切换投影 简单的阐述概括一下网络犯罪的概念是什么呢 网络安全犯罪的共同犯罪都包括了哪些内容呢 macbookair怎么切换快捷键 八面威风成语接龙-八面威风的成语接龙 婴儿眼睛进毛毛怎么办 电商投手是什么职业 请教一下大师,台式电脑的无线网卡是带天线的好还是不带天线的好?光_百... 梦见去吃饭遇到前男友、然后他没钱结账、我出来就被狗咬了大腿、然后... 南海法学是c刊吗 Photoshop CS3 不能使用魔棒,因为没用足够内存RAM ...= ?女朋友要去给闺蜜当伴娘,有点担心,当伴娘都有哪些习俗?详细... ES12中8个很棒的新JavaScript语言特性 支付宝余额宝不安全 Async、Await 从源码层面解析其工作原理 支付宝余额安全还是余额宝安全 详解async/await —— 从入门到实现原理 我在中国,也想在新加坡找工作,有什么途径吗? 余额跟余额宝哪个安全 小米6和小米5x买哪个好 徐州38周可以剖腹产吗? 每次住院都要查血吗?在徐州妇幼保健院 求助苹果7plus.怎么通话录音 ai可以做轮播图吗ai可以滚轮缩放吗 颈椎不好会怎么样 大染坊演职员表 直通车的出价如何统一调整? 直通车溢价怎么调整?有哪些方法? 冰糖炖梨和什么不能一起吃 qq空间V8怎么设置访问权? 什么平台存钱利息高 什么软件存款利息最高