Promise 是 ES2015 新增的对象

Promise 对象有几个组合方法,可以将多个承诺合并成一个进行处理

分别是 Promise.all, Promise.race, Promise.allSettled, Promise.any

这些方法都可以接收一组承诺,返回一个新的承诺

Promise.all(values)

其中参数 values 是一个可迭代对象,比如数组

在后文中使用词语“成功”表示承诺 resolve,“失败”表示承诺 reject

Promise.all

Promise.all 方法返回的承诺会等到参数中所有的承诺都成功之后才会成功,只要其中有一个失败了则返回的承诺也会立即失败,不会等到那些还挂起的承诺有结果

Promise.all 方法可以用来处理那些缺一不可的逻辑

示例:同时发出多个请求都成功后才能进行下一步

const coffee = fetch('/coffee')
const tea = fetch('/tea')
const me = fetch('/me') // 我全都要
const res = await Promise.all([coffee, tea, me])

Promise.race

Promise.race 方法返回参数中最快的那个承诺,如果最快的那个承诺成功则返回的承诺也会成功,否则就是失败,不会等到那些还挂起的承诺有结果

示例:给一个复杂任务设定一个超时时间

// 设置一个定时器,时间到了就 reject 一个承诺
const timeout = new Promise((resolve, reject) => {
setTimeout(reject, 3000)
}) const missions = fetch('/missions') try {
const res = await Promise.race([timeout, missions])
// missions 任务成功
} catch () {
// 时间超过 3 秒了或者任务失败了
}

Promise.allSettled

Promise.allSettled 方法返回的承诺对象会等到参数中所有的承诺对象都完成后才成功,无论怎样该方法返回的承诺都不会失败

和 Promise.all 方法的区别

Promise.all 方法需要参数中的所有承诺都成功

而 Promise.allSettled 对参数中的承诺是成功还是失败并不关心,只要有结果就行

示例:一次性上传多个文件,其中上传成功和上传失败的互不影响,在一轮上传任务完成之后,可以筛选出那些上传失败的重新上传

const upload = file => {
const formData = new FormData()
formData.append('file', file)
return fetch('/upload', {
method: 'POST',
body: formData
})
} document.querySelector('input[type="file"]').addEventListener('change', function(e) {
if (!e.target.value) return
const files = e.target.files
const promises = files.map(file => upload(file)) const res = await Promise.allSettled(promises)
// 全部上传任务都完成了,找出上传失败的重新上传
})

该方法是 ES2020 新添加的方法

Promise.any

Promise.any 方法返回一组承诺中最快成功的那个承诺,如果参数中所有承诺都失败了,那么返回的承诺也失败

和 Promise.race 方法的区别

Promise.race 返回参数中最快的那个承诺,无论它是成功还是失败

而 Promise.any 关注的是参数中最快同时还必须成功的那个承诺

和 Promise.all 方法的区别

Promise.any 和 Promise.all 是完全相反的

Promise.any 参数中全部承诺都失败了才会失败,Promise.all 参数中全部承诺都成功了才会成功

Promise.any 参数中一旦有一个承诺成功了返回的新承诺就会成功,Promise.all 参数中一旦有一个承诺失败了返回的新承诺就会失败

示例:同时加载一组图片,但是我们只需要用到其中的一张,就可以用 Promise.any 方法挑选出最先加载成功的那张图片

const fetchImg = async (url) => {
return fetch(url).then(res => {
if (!res.ok) {
throw new Error('HTTP error!')
} else {
return res.blob()
}
})
} cosnt img1 = fetchImg('/1.png')
const img2 = fetchImg('/2.png') try {
const res = await Promise.any([img1, img2])
const url = URL.createObjectURL(res)
const img = document.createElement('img')
img.src = url
document.body.appendChild(img)
} catch () {
// 一个都没加载成功 QAQ
}

该方法还处于草案中,目前最新的 Chrome, Firefox, Safari 支持

掌握 Promise 的逻辑方法的更多相关文章

  1. promise(3) '静态'方法

    要是人没有梦想,跟咸鱼又有什么两样了?一直恐惧读源码,哪怕是一个简单的库也是读百来行遇到难点就放弃了.对于新的东西也仅仅是知道它拿来干什么,社区资源在哪里,要用时就突击文档资源使用即可.未有过深入之心 ...

  2. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  3. 微信小程序:封装全局的promise异步调用方法

    微信小程序:封装全局的promise异步调用方法 一:封装 function POST(url, params) { let promise = new Promise(function (resol ...

  4. 为Promise添加finally方法支持,把小程序函数变成promise函数

    // 为Promise添加finally方法支持 Promise.prototype.finally = function (callback) {   let P = this.constructo ...

  5. 手写Promise中then方法返回的结果或者规律

    1. Promise中then()方法返回来的结果或者规律 我们知道 promise 的 then 方法返回来的结果值[result]是由: 它指定的回调函数的结果决定的 2.比如说下面这一段代码 l ...

  6. Promise (2) 基本方法

    "I'm Captain Jack Sparrow" 加勒比海盗5上映,为了表示对杰克船长的喜爱,昨天闪现了几次模仿船长的走路姿势(哈哈哈,简直妖娆). 为了周天能去看电影,要赶紧 ...

  7. JS调用android逻辑方法

    1.安卓打开webview时做如下配置 并做一回调接口 这里注意的是 参数 FULIBANG   和 回调接口方法  jsCallWebView 一会在JS里会用到 ================= ...

  8. 聊一聊看似简单的Promise.prototype.then()方法

    Promise.prototype.then() Proise实例的then方法是定义在原型对象Promise.prototype上的,它的作用是为Promise实例添加状态改变时的回调函数. 该方法 ...

  9. [Es6]原生Promise的使用方法

    参考:https://www.cnblogs.com/imwtr/p/5916793.html 1.new Promise(func) 通过实例化构造函数成一个promise对象,构造函数中有个函数参 ...

随机推荐

  1. Spark集群和任务执行

    [前言:承接<Spark通识>篇] Spark集群组件 Spark是典型的Master/Slave架构,集群主要包括以下4个组件: Driver:Spark框架中的驱动器,运行用户编写Ap ...

  2. JSP系列记录

    JSP就是可以实现在html中写Java代码 例: hello.jsp <%@page contentType="text/html; charset=UTF-8" page ...

  3. 【译】关于Rust模块的清晰解释

    原文链接: http://www.sheshbabu.com/posts/rust-module-system/ 原文标题: Clear explanation of Rust's module sy ...

  4. 微信三方平台开发上传base64格式图片至临时素材

    1 public string UploadImgByB64(string b64) 2 { 3 //access_token 需要自己获取 4 string access_token = getTo ...

  5. C# 中大端序与小端序

    C# 中大端序与小端序 static void Main(string[] args) { uint value = 0x12345678; Console.WriteLine("原始字节序 ...

  6. tigervnc 编译

    1.根据BUILDING.txt安装依赖(建议使用默认路径) 其中X11 development kit使用 yum install libX11* 2.修改CMakeList.txt 在前面添加 s ...

  7. DockerInstall

    1.安装Tomcat 2.安装mysql [1].pull [root@pluto tomcat7logs]# docker pull mysql:5.6 [root@pluto tomcat7log ...

  8. 面试BAT必问的JVM,今天我们来说一说它类加载器的底层原理

    类加载器的关系 类加载器的分类 JVM支持两种类加载器,一种为引导类加载器(Bootstrap ClassLoader),另外一种是自定义类加载器(User Defined ClassLoader) ...

  9. 硕思logo设计师注册码去哪里找

    硕思logo设计师注册码去哪里找呢?当然是硕思logo设计师官网啦! 最近小编总是会被网友们咨询关于logo设计的问题,其中很多网友并不是专业的设计人员,特别是一些设计公司面对新手设计时,往往会不知所 ...

  10. 怎样使MathType插入章节标记不显示

    作为专业的公式编辑器,MathType可以帮助大家在Word中插入数学公式,有的时候还需要插入章节标记,那么怎样使章节标记不显示呢?下面就教大家使MathType插入章节标记不显示的技巧. 实际问题如 ...