轻松理解Promise.all 、Promise.then、Promise.race有什么区别以及使用方法
简单来说呢,Promse.all一般应用于某个场景需要多个接口数据合并起来才能实现
有个极大地好处我必须说一下,请求顺序和获取数据顺序是一样的哟,大可放心使用~~
const success1 = new Promise((res,rej) => {
const data = {status: 'success', message:'success1'}
res(data)
})
const error1 = new Promise((res,rej) => {
const data = {status: 'error', message:'error1'}
rej(data.message)
})
const success2 = new Promise((res,rej) => {
const data = {status: 'success', message:'success2'}
res(data)
})
const error2 = new Promise((res,rej) => {
const data = {status: 'error', message:'error2'}
rej(data)
})
Promise.all([success1, success2]).then(res => {
console.log('Promise.all([success1, success2]).then')
console.log(res)
}).catch(error => {
console.log('Promise.all([success1, success2]).catch')
console.log(error)
})
// 打印结果
// Promise.all([success1, success2]).then
// 0: {status: "success", message: "success1"}
// 1: {status: "success", message: "success2"}
// length: 2
// __proto__: Array(0)
Promise.all([success1, error1, success2]).then(res => {
console.log('Promise.all([success1, error1, success2]).then')
console.log(res)
}).catch(error => {
console.log('Promise.all([success1, error1, success2]).catch')
console.log(error)
})
// 打印结果
// Promise.all([success1, error1, success2]).catch
// error1
Promise.all([success1, error1, success2, error2]).then(res => {
console.log('Promise.all([success1, error1, success2, error2]).then')
console.log(res)
}).catch(error => {
console.log('Promise.all([success1, error1, success2, error2]).catch')
console.log(error)
})
// 打印结果
// Promise.all([success1, error1, success2, error2]).catch
// error1
总结:按照上面的使用方法
所有结果成功>按顺序返回成功
有一个失败>返回第一个失败的那个
重点来了~~ 解决有一个失败就全盘失败的方法如下
Promise.all(
[
success1.catch(err=>err),
error1.catch(err=>err),
success2.catch(err=>err),
error2.catch(err=>err)
]
)
.then((res) => {
console.log(res)
if (res[0] && res[0].status == 'success') {
console.log('res[0]success', res[0])
} else {
console.log('res[0]error', res[0])
}
if (res[1] && res[1].status == 'success') {
console.log('res[1]success', res[1])
} else {
console.log('res[1]error', res[1])
}
if (res[2] && res[2].status == 'success') {
console.log('res[2]success', res[2])
} else {
console.log('res[2]error', res[2])
}
if (res[3] && res[3].status == 'success') {
console.log('res[3]success', res[3])
} else {
console.log('res[3]error', res[3])
}
})
// 打印结果
// res[0]success {status: "success", message: "success1"}
// res[1]error error1
// res[2]success {status: "success", message: "success2"}
// res[3]error {status: "error", message: "error2"}
来说一下Promise.prototype.then
下个请求依赖上个请求获取的数据
function P1() {
return new Promise((res, rej) => {
const data = { status: 'success', message: 'res2依赖的数据' }
setTimeout(() => {
res(data)
}, 1000)
})
}
function P2(params) {
return new Promise((res, rej) => {
const data = { status: 'success', message: 'res3依赖的数据', r: params }
setTimeout(() => {
res(data)
}, 2000)
})
}
function P3(params) {
return new Promise((res, rej) => {
const data = { status: 'success', message: '最终结果', r: params }
setTimeout(() => {
res(data)
}, 3000)
})
}
try {
P1()
.then((res) => P2(res))
.then((res) => P3(res))
.then((res) => {
console.log(JSON.stringify(res))
})
} catch (e) {
console.log('执行请求出错', e)
}
// 打印结果
// {
// status: 'success',
// message: '最终结果',
// r: {
// status: 'success',
// message: 'res3依赖的数据',
// r: { status: 'success', message: 'res2依赖的数据' },
// },
// }
最后来看一下Promise.race,简单来说就是几个请求比赛跑步,看谁跑得快,跑的最快的就会被直接返回,不论成功还是失败.
let suc1 = new Promise((res, rej) => {
setTimeout(() => {
res('success1000')
}, 1000)
})
let suc2 = new Promise((res, rej) => {
setTimeout(() => {
res('success1500')
}, 1500)
})
let err1 = new Promise((res, rej) => {
setTimeout(() => {
rej('failed500')
}, 500)
})
let err2 = new Promise((res, rej) => {
setTimeout(() => {
rej('failed500')
}, 2000)
})
Promise.race([suc1, err1])
.then((result) => {
console.log(result)
})
.catch((error) => {
console.log(error)
})
// 打印结果
// failed500
Promise.race([suc1, suc2, err2])
.then((result) => {
console.log(result)
})
.catch((error) => {
console.log(error)
})
// 打印结果
// success1000
附promise.race源码,
重点:Constructor.resolve(entries[i]).then(resolve, reject);
通过循环promise 最终的resolve接收为同一个
function race(entries) {
/*jshint validthis:true */
var Constructor = this; // this 是调用 race 的 Promise 构造器函数。
if (!isArray(entries)) {
return new Constructor(function (_, reject) {
return reject(new TypeError('You must pass an array to race.'));
});
} else {
return new Constructor(function (resolve, reject) {
var length = entries.length;
for (var i = 0; i < length; i++) {
Constructor.resolve(entries[i]).then(resolve, reject);
}
});
}
}
总结:由此可以看到,我们可以用它来
1.测试接口的响应速度
2.当用户信号不好的时候可以发出网络不好的提示信息
3.后端代码部署了很多服务器,我们可以看哪个速度快就用哪个的数据
欢迎路过的小伙伴们继续补充哦~~
结语
欢迎大家指出文章需要改正之处~
如果有更好的方法,欢迎大家提出来,共同进步哟~~
轻松理解Promise.all 、Promise.then、Promise.race有什么区别以及使用方法的更多相关文章
- 深入理解JS异步编程三(promise)
jQuery 原本写一个小动画我们可能是这样的 $('.animateEle').animate({ opacity:'.5' }, 4000,function(){ $('.animateEle2' ...
- 【JavaScript进阶】深入理解JavaScript中ES6的Promise的作用并实现一个自己的Promise
1.Promise的基本使用 // 需求分析: 封装一个方法用于读取文件路径,返回文件内容 const fs = require('fs'); const path = require('path') ...
- 手写一款符合Promise/A+规范的Promise
手写一款符合Promise/A+规范的Promise 长篇预警!有点长,可以选择性观看.如果对Promise源码不是很清楚,还是推荐从头看,相信你认真从头看到尾,并且去实际操作了,肯定会有收获的.主要 ...
- 一步一步实现一个Promise A+规范的 Promise
2015年6月,ES2015(即ES6)正式发布后受到了非常多的关注.其中很重要的一点是 Promise 被列为了正式规范. 在此之前很多库都对异步编程/回调地狱实现了类 Promise 的应对方案, ...
- promise核心6 自定义promise
1.定义整体结构(不写实现) 定义一个自己的promise的库 lib(库的简写) 一个js文件.一个js模块(不能用es6 也不能commjs)(用es5模块语法 ) 匿名函数自调用.IIFE ( ...
- promise核心 为什么用promise
为什么要用promise 1.使用纯回调函数 先指定回调函数,再启动异步任务 答 1.指定回调函数的方式更加灵活 可以在执行任务前,中,后 2.支持链式调用,解决回调地狱问题 什么是回调地狱:回调函数 ...
- 到底什么是promise?有什么用promise怎么用
相信很多人刚接触promise都会晕,但学会后却离不开它,本文详细介绍一下promise,promise解决的问题,帮助新手快速上手 [扫盲] 什么是promise? promise是一种约定,并非一 ...
- Promise.resolve( data)与Promise.reject( data )
Promise.resolve( data)与Promise.reject( data ) 常用来生成已经决议失败或成功的promise实例: 1.Promise.reject(data)不管传递的是 ...
- 轻松理解Redux原理及工作流程
轻松理解Redux原理及工作流程 Redux由Dan Abramov在2015年创建的科技术语.是受2014年Facebook的Flux架构以及函数式编程语言Elm启发.很快,Redux因其简单易学体 ...
- 轻松理解MYSQL MVCC 实现机制
轻松理解MYSQL MVCC 实现机制 转载https://blog.csdn.net/whoamiyang/article/details/51901888 1. MVCC简介 1.1 什么是MVC ...
随机推荐
- Paxos分布式系统共识算法?我愿称其为点歌算法…
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 分布式系统共识算法Paxos相信大家都不陌生,它被称为最难理解的算法不是没有道理的,首先,它的发表之路就充满了坎 ...
- 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm
前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...
- 常用CSS样式属性
01.常用样式 1.1.background背景 设置元素背景的样式 background,更好的衬托内容. 属性 描述 值 background 背景属性简写.支持多组背景设置,逗号,隔开 back ...
- 使用WSL2连接USB设备
目录 要求 安装 第一步 在Window安装usbipd 第二步 在WSL里安装USBIP 工具和硬件数据库 使用方法 22.3.19 微软官方文档:连接 USB 设备 | Microsoft Doc ...
- Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo
前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli,但在中大型的企业级项目中,通 ...
- Java新特性(2):Java 10以后
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 虽然到目前为止Java的版本更新还没有什么惊天动地的改变,但总是会冒出一些有趣的小玩意.前面列举了Java9和Java10的一些特色,现在接着来 ...
- 【云原生 · Kubernetes】Kubernetes容器云平台部署与运维
[题目1]Deployment管理 在master节点/root目录下编写yaml文件nginx-deployment.yaml,具体要求如下: (1)Deployment名称:nginx-deplo ...
- 基于Spring-AOP的自定义分片工具
作者:陈昌浩 1 背景 随着数据量的增长,发现系统在与其他系统交互时,批量接口会出现超时现象,发现原批量接口在实现时,没有做分片处理,当数据过大时或超过其他系统阈值时,就会出现错误.由于与其他系统交互 ...
- C# Aspose.Words.Document.PageCount 踩坑笔记(获取文档页数)
事情是这样的,我需要获取Word文档的页数,结果就遇到了这个坑人的问题. var doc = new Aspose.Words.Document(@"相对路径"); doc.Pag ...
- psutil.AccessDenied: psutil.AccessDenied
解决办法 import psutil for proc in psutil.process_iter(): try: print(proc.name()) except (psutil.NoSuchP ...