前端-Promise详解与实例
1|0Promise.all和Promise.race传入空数组
关于将 Promise.all和 Promise.race传入空数组的两段代码的输出结果说法正确的是:
Promise.all([])会返回一个成功状态的promise
Promise.race([])会返回一个pending状态的promise
2|0promise的超时控制
Promise原生是不支持设置超时时间的,也不支持中断请求。如果我们想要实现超时控制或者取消重复请求这样的需求,只能寻求其它思路,另外这两个需求本质上都是中断请求,并且我们可以随
控制什么时候中断。
总体思路是:创建一个新的newPromise,和原来用于发送请求的originPromise作为参数传入Promise.race方法中,接下来使用这个race方法返回的promise,上边添加then和catch方法。如果
要中断原来的promise,只需要将newPromise变成失败状态即可。
2|1需求1:自定义实现超时控制
请求是无法设置超时时间的,因此我们需要自己去模拟一个超时控制。
方法一:使用promise.race
方法二:不使用promise.race。但是本质上相当于自定义实现了promise.race,手动创建一个promise的数组,让每一个promise都开始执行,谁的状态先改变就以谁的状态为准
2|2需求2:转盘问题
转盘问题,一个抽奖转盘动画效果有5秒,但是一般来说向后端请求转盘结果只需要不到一秒,因此请求结果至少得等5秒才能展现给用户。
需要考虑两种情况。
- 转盘动画还未完成,请求结果已经拿到了,此时要等到动画完成再展示结果给用户。
- 转盘动画完成了,请求结果还未拿到,此时需要等待结果返回(可以设置请求超时时间)。
所以,转盘问题更适合用Promise.all()来解决。
3|0取消重复请求
同一类请求是有序发出的(根据按钮点击的次序),但是响应顺序却是无法预测的,我们通常只希望渲染最后一次发出请求响应的数据,而其他数据则丢弃。因此,我们需要丢弃(或不处理)除最
一次请求外的其他请求的响应数据。
4|0限制并发请求数
Promise.allSettled不适合应对这样的场景,它能控制的粒度还是太粗了。它必须等待所有Promise都resolve或reject后才能继续。比如现在总共有10个请求,并发请求数限制为4个,当其中
个请求完成时,应该就可以进行下一个请求了,为了最高效率,要始终保证并发请求数量被最大程度使用。但是如果使用Promise.allSettled,它必须等待4个请求都完成了才能进行接下来的4个
求,这显然是不合理的。
5|0实现有并行限制的Promise调度器
6|0自定义实现allSettled
7|0自定义实现Promise.all和Promise.race
7|1Promise.all:
7|2Promise.race:
问:上边代码中能否直接将resolve传递给then方法,或者能否直接将reject传递给catch方法?
是可以的。当原来的promise变为成功状态时,会去调用then的函数参数,并将原来调用resolve时传递的参数作为then的回调函数的参数。所以可以写的更简洁:
8|0全局捕获promise异常
业务场景:团队开发中可能有同学忘记处理promise的异常,此时全局中应该对此异常进行捕获,做一个兜底。
9|0对比Promise.race方法,实现一个last方法
描述:race方式是接收一个数组,只要其中有一个promise实例的状态率先改变,最终promise的实例就会改变。现在要对比着自定义实现一个last方法,不管前边的promise状态怎么变,我们只
据最后一个发生状态改变的promise来决定最终promise实例的状态。
10|0实现并行发送请求的函数
要求实现一个send(list, n, callback)函数,该函数接收三个参数,第一个参数是存储url的数组,第一个参数是限制的并发请求数,第三个参数是回调函数。要求在发送请求的过程中收集数据
存入数组中,数据和请求发送的顺序要一一对应。最后所有请求完成时,调用callback([data1, data2, data3, ...])。本题假设所有请求都会被正常处理,有返回结果。
__EOF__

本文链接:https://www.cnblogs.com/HaruhiSuzumiya/p/16709277.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix