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拓展方法手写
Promise合集的更多相关文章
- 小程序框架WePY 从入门到放弃踩坑合集
小程序框架WePY 从入门到放弃踩坑合集 一点点介绍WePY 因为小程序的语法设计略迷, 所以x1 模块化起来并不方便, 所以x2 各厂就出了不少的框架用以方便小程序的开发, 腾讯看到别人家都出了框架 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- 【Android】开发中个人遇到和使用过的值得分享的资源合集
Android-Classical-OpenSource Android开发中 个人遇到和使用过的值得分享的资源合集 Trinea的OpenProject 强烈推荐的Android 开源项目分类汇总, ...
- [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集
虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集
Erlang Resources 小站 2013年7月~12月资讯合集,方便检索. 附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集 小站地 ...
- SQL用法操作合集
SQL用法操作合集 一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...
- Python学习路径及练手项目合集
Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159
- Lucene搜索方式大合集
package junit; import java.io.File; import java.io.IOException; import java.text.ParseException; imp ...
- [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集
很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- android 图像处理系列合集
为了便于大家对滤镜算法的学习,以后发布的图像处理滤镜系列帖子会在这里汇总,本人第一次写合集,写得不好的地方大家请见谅,手头上虽然有一些滤镜的算法,但是大多不是android版的,教程里的代码大多是我借 ...
随机推荐
- C# NAudio 检测声音
using NAudio.Wave;using System;using System.Collections.Generic; namespace WinFromBaidu{ class NAudi ...
- openstack:OpenStack架构详解,
OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云 ...
- 服务器DMZ理解
转别人的 您的公司有一堆电脑,但可以归为两大类:客户机.服务器.所谓客户机就是主动发起连接请求的机器,所谓服务器就是被动响应提供某些服务的机器.服务器又可以分仅供企业内网使用和为外网提供服务两种. ...
- layui.dtree的学习,自定义扩展toolbar按钮(toolbarExt)
学习layui.dtree请前往 http://www.wisdomelon.com/DTreeHelper/ 记录一下dtree的自定义扩展toolbar按钮(toolbarExt) html代码: ...
- AcWing 66. 两个链表的第一个公共结点 (2012算法题)
题目: 输入两个链表,找出它们的第一个公共结点. 当不存在公共节点时,返回空节点. 数据范围 链表长度 [1,2000]. 保证两个链表不完全相同,即两链表的头结点不相同. 样例 给出两个链表如下所 ...
- linux shell 目录
linux shell 目录 目录 linux shell 目录 类型 unix支持三大主流shell linux支持的shell(可有四种) 部分相关命令 查询进程 ps pstree kill 查 ...
- 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 ...
- 2020.11.14 typeScript声明空间
在ts中存在两种声明空间: 类型声明空间和变量声明空间. 类型声明空间: 1. class People {} 2. interface People {} 3. type People = {} 变 ...
- Repeater 绑定数据是根据数据修改行的颜色值信息
<ItemTemplate> <tr <%# Eval("dayu20").ToString()=="0"? "style=' ...
- 操作kubernets(k8s)的增删改查
资源的CRUD: 创建: Service service = client.services().inNamespace(namespace).create(service); 更新: Namespa ...