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拓展方法手写

Promise合集的更多相关文章

  1. 小程序框架WePY 从入门到放弃踩坑合集

    小程序框架WePY 从入门到放弃踩坑合集 一点点介绍WePY 因为小程序的语法设计略迷, 所以x1 模块化起来并不方便, 所以x2 各厂就出了不少的框架用以方便小程序的开发, 腾讯看到别人家都出了框架 ...

  2. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  3. 【Android】开发中个人遇到和使用过的值得分享的资源合集

    Android-Classical-OpenSource Android开发中 个人遇到和使用过的值得分享的资源合集 Trinea的OpenProject 强烈推荐的Android 开源项目分类汇总, ...

  4. [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集

    虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/   ...

  5. [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集

    Erlang Resources 小站 2013年7月~12月资讯合集,方便检索.     附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集    小站地 ...

  6. SQL用法操作合集

    SQL用法操作合集   一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...

  7. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  8. Lucene搜索方式大合集

    package junit; import java.io.File; import java.io.IOException; import java.text.ParseException; imp ...

  9. [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集

    很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/     ...

  10. android 图像处理系列合集

    为了便于大家对滤镜算法的学习,以后发布的图像处理滤镜系列帖子会在这里汇总,本人第一次写合集,写得不好的地方大家请见谅,手头上虽然有一些滤镜的算法,但是大多不是android版的,教程里的代码大多是我借 ...

随机推荐

  1. MATLAB 多行注释

    自用的两种方法 1: %{ 若干语句 } % 2.快捷键CTRL+R,取消注释CTRL+T

  2. python3GUI--实用!B站视频下载工具(附源码)

    目录 一.准备工作 二.预览 1.启动 2.解析 3.下载中 4.下载完成 5.结果 三.设计流程 1.bilibili_video_spider 2.视频json的查找 四.源代码 1.Bilibi ...

  3. AES加密 php7版本 openssl_encrypt 遇到的坑

    与前端对接api ,解密不了前端加密的数据. 问题描述: 1.前端用 cryptojs  加密的 密钥是24位 , 2.后端用的php7的 openssl_encrypt  同密钥来进行解密,发现解密 ...

  4. Ubuntu-18.04.1-live-server-amd64.iso安装全过程

    以下向你介绍安装Ubuntu-18.04.1-live-server-amd64.iso版本的全过程,同时要说明的是Ubuntu 18.04.1 server版本只能通过文本的方式安装,即它没有和Ub ...

  5. hdu:Two Rabbits(区间DP)

    Problem DescriptionLong long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny af ...

  6. 08.File类与IO流

    一.File 类 是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. Java 把电脑中的文件和文件夹(目录)封装为了一个 File 类. File 类是与系统无关的类,任何操 ...

  7. 转载·Pycharm Pro“This license 56ZS5PQ1RF has been cancelled” 激活码失效处理记录

    今天打开许久没用的Pycharm提示激活码过期,激活提示:"This license 56ZS5PQ1RF has been cancelled" 解决方法如下 首先修改hosts ...

  8. 手机设置fiddler代理后无法上网

    方法一:打开防火墙设置 参考链接:https://www.jianshu.com/p/b122eab059c4 1.打开控制面板->系统和安全->Windows Defender 防火墙, ...

  9. 2020.6.6OO学期末总结

    0.前言 本次博客是对整个java及oo学习情况的一个概略性总结,目的在于反思这半年来的学习情况和实际感受,和具体学习方面的理解和问题. 1.作业过程总结 看着自己一个学期做的所有作业,我想起的是总是 ...

  10. 基于5G边缘网关的智慧公交站台应用

    发展智能物联网,有利于提高城市运行效率,优化居民生活体验,促进城市迸发活力.智能物联网已经融合进生活的方方面面,例如最常见.分布最广泛的公交站台,也能够通过物联网实现升级换代,为居民提供更丰富.更便捷 ...