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. C# NAudio 检测声音

    using NAudio.Wave;using System;using System.Collections.Generic; namespace WinFromBaidu{ class NAudi ...

  2. openstack:OpenStack架构详解,

    OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云 ...

  3. 服务器DMZ理解

    转别人的 您的公司有一堆电脑,但可以归为两大类:客户机.服务器.所谓客户机就是主动发起连接请求的机器,所谓服务器就是被动响应提供某些服务的机器.服务器又可以分仅供企业内网使用和为外网提供服务两种.   ...

  4. layui.dtree的学习,自定义扩展toolbar按钮(toolbarExt)

    学习layui.dtree请前往 http://www.wisdomelon.com/DTreeHelper/ 记录一下dtree的自定义扩展toolbar按钮(toolbarExt) html代码: ...

  5. AcWing 66. 两个链表的第一个公共结点 (2012算法题)

    题目: 输入两个链表,找出它们的第一个公共结点. 当不存在公共节点时,返回空节点. 数据范围 链表长度 [1,2000]. 保证两个链表不完全相同,即两链表的头结点不相同. 样例  给出两个链表如下所 ...

  6. linux shell 目录

    linux shell 目录 目录 linux shell 目录 类型 unix支持三大主流shell linux支持的shell(可有四种) 部分相关命令 查询进程 ps pstree kill 查 ...

  7. Rename a Local and Remote Git Branch

    Renaming Git Branch Follow the steps below to rename a Local and Remote Git Branch: 01 Start by swit ...

  8. 2020.11.14 typeScript声明空间

    在ts中存在两种声明空间: 类型声明空间和变量声明空间. 类型声明空间: 1. class People {} 2. interface People {} 3. type People = {} 变 ...

  9. Repeater 绑定数据是根据数据修改行的颜色值信息

    <ItemTemplate> <tr <%# Eval("dayu20").ToString()=="0"? "style=' ...

  10. 操作kubernets(k8s)的增删改查

    资源的CRUD: 创建: Service service = client.services().inNamespace(namespace).create(service); 更新: Namespa ...