ES6中的Promise、async、await,超详细讲解!

Promise是es6引入的异步编程新解决方案,Promise实例和原型上有reject、resolve、all、then、catch、finally等多个方法,语法上promise就是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果,本篇文章主要介绍了ES6中的Promise对象与async和await方法,创作不易,如果能帮助到带大家,欢迎收藏+关注 哦 💕

🌈🌈文章目录

Promise

promise状态

Promise.prototype.then

Promise.prototype.catch

Promise.prototype.finally

执行次序

示例1

示例2

链式调用

链式传值

catch对调用链的影响

catch处在最后

catch处在中间

async & await

async

await

Promise

promise状态

Promise总是处于以下三种状态之一:

  • pending:初始状态
  • fulfilled/resolved:表示成功
  • rejected:表示失败

状态有一些特性:

  • 只能通过执行函数修改
  • 外部无法读取
  • 外部无法修改

Promise.prototype.then

Promise实例添加处理程序的主要方法,接收的两个参数分别表示进入fulfilled/resolvedrejected状态时被调用,且二者互斥。两个参数可选,但必须是函数类型,非函数类型会被忽略。一个Promise实例可以有任意多个处理程序(任意多个then调用

Promise.prototype.catch

等价于Promise.prototype.then(null,onRejected)

Promise.prototype.finally

无论状态是fulfilled/resolved还是rejected都会执行,但无法得知具体的状态(状态无关),一般主要用于清理工作

执行次序

示例1
const p = new Promise(resolve => {console.log('1. excute promise');setTimeout(() => {console.log('3. before resolve')resolve();console.log('4. after resolve')}, 100);
})p.then(() => {console.log('5. execute resolve')
}).then(()=>{console.log('6. then2')
}).then(()=>{console.log('7. then3')
}).finally(()=>{console.log('8. finally')
});
console.log('2. sync then')/**
result:
1. excute promise
2. sync then
3. before resolve
4. after resolve
5. execute resolve
6. then2
7. then3
8. finally
*/
示例2
const p = new Promise(resolve => {setTimeout(() => {resolve();}, 100);
})p.then(()=>{console.log('then1')
}).then(()=>{console.log('then2')
}).then(()=>{console.log('then3')
}).then(()=>{console.log('then4')
}).then(()=>{console.log('then5')
});
console.log('async then')/**
result:
async then
then1
then2
then3
then4
then5
*/

这个示例中then1then2then3then4then5相当于是同步执行的

链式调用

then的链式调用是Promise最常见的用法,具体方式是每个执行器返回一个Promise实例,则后续每个then都会等待前一个落定后再执行,即异步的串行化。以此来解决异步的回调地狱难题。

es6规范不支持Promise终止与进度查询,原因是这样会使得Promise变得过于复杂。

链式传值
const p = new Promise(resolve => {setTimeout(() => {resolve(100);}, 100);
})p.then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return new Promise(resolve => {setTimeout(() => {resolve(value + 1)}, 3000);});
}).then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return value + 1;
});/**
100
101
102 等待3秒
103
104
*/

如果执行函数返回的是一个Promise对象,则后续的调用会等待该对象落定后触发,通过resolve方式传值;如果不是,则后续立即触发,通过return语句向后传值

catch对调用链的影响

catch处在最后
const p = new Promise(resolve => {setTimeout(() => {resolve(100);}, 100);
})p.then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return new Promise((resolve, reject) => {setTimeout(() => {reject('fail')}, 3000);});
}).then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return value + 1;
}).catch(err => {console.log('catch', err);return new Promise((resolve, reject) => {setTimeout(() => {resolve(400)}, 3000);});
});
/**
100
101
catch fail
*/

catch处在调用链最后的时候,则reject后续的then将不会被触发

catch处在中间
const p = new Promise(resolve => {setTimeout(() => {resolve(100);}, 100);
})p.then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return new Promise((resolve, reject) => {setTimeout(() => {reject('fail')}, 3000);});
}).then(value => {console.log(value)return value + 1;
}).catch(err => {console.log('catch', err);return 500;
}).then(value => {console.log(value)return value + 1;
}).then(value => {console.log(value)return value + 1;
});
/**
100
101
catch fail
*/

catch处在调用链中间,如果返回的不是一个Promise对象,后续的then将不会被触发

async & await

async

语法:

async function name([param[, param[, ... param]]]) {statements
}
  • name:函数名称
  • param:要传递给函数的参数的名称
  • statements:包含函数主体的表达式,可以使用await机制
  • 返回值:一个Promise,这个Promise要么会通过一个由async函数返回的值被解决,要么会通过一个从async函数中抛出的(或其中没有被捕获到的)异常被拒绝

async关键字用于声明异步函数,可以用在函数声明、函数表达式、箭头函数、方法上:

async function foo() {}
let bar = async function () {}
let baz = async () => {}
class Person{async say(){}
}

异步函数如果使用return关键字返回了值,则这个值会被Promise.resolve()包装成一个Promise对象

async function test() {return 2;
}
test().then(value => {console.log(value)
})
console.log(1)/**
1
2
*/

如果函数体中抛出了异常,可以用catch处理:

async function test() {const result = 100 / a;return result;
}
test().catch(value => {console.log(value)
})
console.log(1)
/**
1
ReferenceError: a is not defined
*/

一些资料中会说拒绝Promise的异常不被异步函数捕获,但在最新版的Chrome(95.0.4638.69)Microsoft Edge(95.0.1020.40)Firefox(93.0)都是支持的:

async function test() {return Promise.reject('error');
}
test().catch(value => {console.log(value)
})
console.log(1)
/**
1
error
*/

await

语法:

[返回值] = await 表达式;

  • 表达式:一个Promise对象或者任何要等待的值
  • 返回值:返回Promise对象的处理结果。如果等待的不是Promise对象,则返回该值本身

在用法上,await可以单独使用,也可以在表达式中使用:

async function func(){console.log(await Promise.resolve('foo'))
}
func();
/**
foo
*/

await只能在async函数内顶层使用,不支持嵌套

 在使用多个await关注其结果,忽视其顺序有时候是个好事,因为不同的规范对于await处理Promise是有差异的。

🚀 个人简介:某大型国企高级前端开发工程师,7年研发经验,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~

💟 作    者:码喽的自我修养❣️
📝 专    栏:JavaScript深入研究

🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪 

 更多专栏订阅推荐:

👍 前端工程搭建
💕 vue从基础到起飞

✈️ HTML5与CSS3

⭐️ uniapp与微信小程序

📝 前端工作常见问题汇总

✍️ GIS地图与大数据可视化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392716.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(免费领源码)java#SSM#MYSQL私家车位共享APP 51842-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1 课题的研究背景 1.2研究内容与研究目标 1.3ssm框架 1.4论文结构与章节安排 2 2 私家车位共享APP系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析 2…

原型图绘制技巧

针对于 Axure RP绘图软件。 1、拉辅助线 目的,确定画布大小尺寸从上面和左面的刻度尺上,点击鼠标,拖动,就可以拉出一条线。 2、画布底模设为组件 右键转换为母版,方便后续其他页面使用 3、按钮 按钮字体不要太大&am…

【嵌入式】STM3212864点阵屏使用SimpleGUI单色屏接口库——(2)精简字库

一 开源库简介与移植 最近一个项目需要用12864屏幕呈现一组较为复杂的菜单界面,本着不重复造轮子的原则找到了SimpleGUI开源库。 开源地址:SimpleGUI: 一个面向单色显示屏的开源GUI接口库。 SimpleGUI是一款针对单色显示屏设计的接口库。相比于传统的GUI…

SpringBoot集成阿里百炼大模型(初始demo) 原子的学习日记Day01

文章目录 概要下一章SpringBoot集成阿里百炼大模型(多轮对话) 原子的学习日记Day02 整体架构流程技术名词解释集成步骤1,选择大模型以及获取自己的api-key(前面还有一步开通服务就没有展示啦!)2&#xff0c…

CSS学习 02 利用鼠标悬停制造按钮边框的渐变方向变化

效果 页面背景为深灰色,使用Karla字体。容器内的按钮居中显示,按钮有一个彩色渐变的边框。按钮的背景为黑色,文字为浅灰色。当鼠标悬停在按钮边框上时,边框的渐变方向变化,按钮文字变为白色,并且按钮内边距…

简单猜谜小程序开发

了解小程序的结构 项目根目录 包含小程序的配置文件和其他资源。 页面目录 每个页面都有独立的目录,通常包含 .json、.wxml、.wxss、.js 文件: .json:页面配置文件,用于配置页面的窗口表现等。 .wxml:页面的布局文件…

JS等待所有方法执行完成在执行下一个方法,promise All

在工作中会遇到这样一个场景,前端需要拿到不同接口返回的结果在执行某个逻辑,当使用链式那样的方式去请求,等一个接口响应完在请求下一个接口,这种方法就会导致请求时间特别长。这个时候就可以使用promise all,同时请求…

Python酷库之旅-第三方库Pandas(067)

目录 一、用法精讲 266、pandas.Series.dt.second属性 266-1、语法 266-2、参数 266-3、功能 266-4、返回值 266-5、说明 266-6、用法 266-6-1、数据准备 266-6-2、代码示例 266-6-3、结果输出 267、pandas.Series.dt.microsecond属性 267-1、语法 267-2、参数 …

IDEA如何去掉编辑框右侧的竖线

打开 IntelliJ Idea 软件 依次找到 File—>Settings—>Editor—>General—>Appearance 去掉勾选 Show hard wrap and visual guides (configured in Code Style options)

PHP海报在线制作系统小程序源码

创意无限,设计零门槛! 🎨 一键解锁设计大师潜能 你还在为找不到合适的设计师制作海报而烦恼吗?告别繁琐沟通,拥抱“海报在线制作系统”!这个神奇的平台,让你无需任何设计基础,也能…

后台弱口令部署war包 漏洞复现

1.搭建好环境打开页面---点击右方的manager app 默认账号密码为tomcat 2.登录完成后滑到下面点击浏览 3.将你生成的jsp木马压缩为zip格式并将后缀名改为war 4.提交此war压缩包然后在目录中点击 5.点击完后在后面加lkj.jsp,访问成功证明注入成功 5.打开哥斯拉连接…

js获取近30天近60天时间区间

1.从今天往前推30天 handleSetTime(value) {//value传入自定义时间 30/60/90//因为这里要加上今天时间,所以开始时间-1const value1 value - 1const date new Date()const startTimestamp date.getTime() - value1 * (24 * 60 * 60 * 1000 * 1)const sDate new Date(startTi…

Unity实现屏幕黑边--游戏画面和UI异形屏处理(安全区渲染)

在手机上,如果想以黑边形式显示游戏画面,比如显示区域避开异形屏、水滴屏那一行。有很多种思路,最后觉得下面这种方法比较简单合适,下面分享一下。 方法:需要分别处理,游戏画面黑边、UI黑边: …

帮助网站提升用户参与度的5个WordPress插件

仅靠编写精彩的内容、设计精美的图像和创建简化的客户旅程不足以提高网站参与度。您需要让用户在首次访问后继续与您的网站互动并成为回访者,才能真正吸引您所追求的兴趣。 幸运的是,对于 WordPress 用户来说,有数百种工具可用于提高用户参与…

html实现好看的塔罗牌、十二星座运势网站源码

文章目录 1.设计来源1.1 十二星座1.2 所有界面效果图 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/deta…

java网络爬虫

前言 单一个项目的功能需要测试的时候,就需要使用大量的假数据做测试,但是这些数据又不能太假,必须合乎常理。于是我们需要爬虫爬取一些网站的一些允许爬取的数据,来做项目功能测试。 一.确认爬取目标 现在爬取下面三个网站的数据…

常用的GPIO的配置(基于STM32F103C8xx)

绿色:注释 紫色:实际使用代码 //开启GPIOB的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); ①可选输入值:RCC_APB2Periph_GPIOA 或者 RCC_APB2Periph_GPIOB 或者 RCC_APB2Periph_ALL ②可选输入值&a…

【云原生】恰当运用kubernetes中三种探针,确保应用程序在Kubernetes集群中保持健康、可用和可靠

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

电脑录屏软件免费版,分享4款,轻松录制精彩瞬间

电脑录屏已成为创作、教学和分享的热门方式。然而,对于一些用户来说,购买专业的录屏软件可能会增加负担。幸运的是,市场上存在许多电脑录屏软件免费版的选择。它们提供了丰富的功能,让您可以尽情展现您的创意,无须为此…

蝙蝠避障:盲人出行的守护者,让每一步都安心

在这个多彩的世界里,作为一位盲人,我时常感受着出行的种种挑战。每一次踏出家门,都是一场未知的探险,心里难免有些忐忑。街道上的车流声、人群的喧闹,这些对我而言只是模糊的背景音,真正让我担忧的是那些突…