Promise合集
Promise.all
Promise.all
可以将多个 Promise 实例包装成一个新的 Promise 实例。所有的 Promise 对象都成功时返回的是一个结果数组,一旦有任何一个 Promise 对象失败则立即返回失败。
let ps1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success-1') }, 6000) }) let ps2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success-2') }, 3000) }) let pf1 = new Promise((resolve, reject) => { setTimeout(() => { reject('fail-1') }, 4000) }) let pf2 = new Promise((resolve, reject) => { setTimeout(() => { reject('fail-2') }, 2000) }) Promise.all([ps1, ps2]).then(arr => { console.log(arr) // 执行成功,输出:['success-1', 'success-2'] }).catch(error => { console.log(error) }) Promise.all([ps1, pf1, ps2, pf2]).then(arr => { console.log(arr) }).catch(error => { console.log(error) // 执行失败,输出:fail-2 })
注意:Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。
Promise.race
顾名思义,Promise.race
是赛跑的意思,Promise.race 中的 Promise 数组中谁先返回成功或失败的结果,整体就返回那个结果
let ps1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success-1') }, 6000) }) let ps2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success-2') }, 3000) }) let pf1 = new Promise((resolve, reject) => { setTimeout(() => { reject('fail-1') }, 4000) }) let pf2 = new Promise((resolve, reject) => { setTimeout(() => { reject('fail-2') }, 2000) }) Promise.race([ps1, ps2]).then(result => { console.log(result) // 执行成功,输出:success-2 }).catch(error => { console.log(error) }) Promise.race([ps1, ps2, pf1, pf2]).then(result => { console.log(result) }).catch(error => { console.log(error) // 执行失败,输出:fail-2 })
注意:Promise.race 中的各 Promise 的执行顺序是无序的。可用于对某些不支持设置 timeout 的请求模拟请求超时和中止请求。
Promise.allSettled
Promise.allSettled
中的 Promise 数组全部执行完才会返回一个对象数组,其中包含了每个 Promise 的执行结果,且都有一个 status
字段,fulfilled
表示成功,rejected
表示失败。
let ps1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success-1') }, 6000) }) let ps2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success-2') }, 3000) }) let pf1 = new Promise((resolve, reject) => { setTimeout(() => { reject('fail-1') }, 4000) }) let pf2 = new Promise((resolve, reject) => { setTimeout(() => { reject('fail-2') }, 2000) }) Promise.allSettled([ps1, ps2, pf1, pf2]).then(arr => { console.log(arr) // 输出:[{status: "fulfilled", value: "success-1"}, {status: "fulfilled", value: "success-2"}, {status: "rejected", reason: "fail-1"}, {status: "rejected", reason: "fail-2"}] })
注意:Promise.allSettled 返回结果数组 arr 与请求的 Promise 数组顺序一致,与异步请求响应返回的顺序无关。Promise.allSettled 可通过返回的数组中的 status 字段,用于判断成功和失败的数量,如上传图片成功几张、失败几张。
参考链接:https://www.lervor.com/archives/137/
手写Promise:https://juejin.cn/post/6945319439772434469#heading-5
常见面试手写题:https://juejin.cn/post/7033275515880341512 包含所有promise拓展方法手写
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!