JavaScript 异步编程解决方案-中篇

天下事有难易乎? 为之,则难者亦易矣;不为, 则易者亦难矣。人之为学有难易乎? 学之,则难者亦易矣;不学,则易者亦难矣。

async 函数 和promise then的规则一样

	async function fun() {
				//1.如果返回一个非promise,返回的是一个成功的promise值 
				// return 1
				//2.如果返回一个promise,返回的状态值就是promise值 
				return new Promise((reslove, rejcet) => {
					// reslove('ok')
					// rejcet('error')

					throw '错误'
				})
			}
			console.log(fun());
		//await  表达式  右边一般是promise 对象也可以是其他值
		//必须写在async  函数 。async函数里面没有await 
		//如果await  promise 异常可以用try  cath 捕获
	async function func() {
				let a = await 100
				console.log(a);
				let p = new Promise((reslove, reject) => {
					// reslove('helloWorld')
					reject('err')
				})
				try {
					await p
				} catch (e) {
					console.log(e);
				}
			}
			func()

1,如何使用promise

在这里插入图片描述

1.Promise 构造函数:new Promise(executor)

Promise() 只能通过 new 运算符来构造。如果尝试在没有使用 new 的情况下调用它,会抛出 TypeError 异常。

1.executor 执行器函数:(resolve,reject)=>{}
2.resolve 函数:内部定义成功时候调用values=>{}
3.reject 函数:内部定义失败时候调用error=>{}

备注:executor 会在Promise内部同步调用,异步调用在回调函数里面

let p = new Promise((resolve, reject) => {
				//同步调用
				console.log('调用了额');
			})
			console.log('外部');
		</script>
2.Promise.prototype.then()

Promise 实例的 then() 方法最多接受两个参数:用于 Promise 兑现和拒绝情况的回调函数。它立即返回一个等效的 Promise 对象,允许你链接到其他 Promise 方法,从而实现链式调用。
then(onFulfilled) onFulfilled 成功回调
then(onFulfilled, onRejected) onRejected失败回调

以下: Promise 对象(称之为 p)

1.返回一个值:p 以该返回值作为其兑现值。
let p = new Promise((resolve, reject) => {
				//同步调用

				resolve(1)

			})
			console.log(p);

在这里插入图片描述
在这里插入图片描述

2.没有返回任何值:p 以 undefined 作为其兑现值。

在这里插入图片描述

3.抛出一个错误:p 抛出的错误作为其拒绝值。
let p = new Promise((resolve, reject) => {
				//同步调用

				throw new Error('错误了')

			})
			console.log(p);

在这里插入图片描述

4.返回一个已兑现的 Promise 对象:p 以该 Promise 的值作为其兑现值。
5.返回一个已拒绝的 Promise 对象:p 以该 Promise 的值作为其拒绝值。
6.返回另一个待定的 Promise 对象:p 保持待定状态,并在该 Promise 对象被兑现/拒绝后立即以该 Promise 的值作为其兑现/拒绝值。
3.Promise.prototype.catch() 失败的回调

Promise 实例的 catch() 方法用于注册一个在 promise 被拒绝时调用的函数。它会立即返回一个等效的 Promise 对象,这可以允许你链式调用其他 promise 的方法。此方法是 Promise.prototype.then(undefined, onRejected) 的一种简写形式。
catch 方法用于在 Promise 链进行错误处理

	let p = new Promise((resolve, reject) => {
				//同步调用

				reject('错误')

			})
			p.catch(err => {
				console.log(err);
			})
4.Promise.reject()

Promise.reject() 静态方法返回一个已拒绝(rejected)的 Promise 对象,拒绝原因为给定的参数

let p2 = Promise.reject('1')

			let p3 = Promise.reject(new Promise((resolve, reject) => {
				resolve('ok')
			}))

			//无论传什么类型都返回失败的结果
5、Promise.resolve() 接受一个参数,返回成功或者失败的promise,

备注 :传入的是非promise值,结果一直是成功、传入的是promise对象,promise参数结果的值,决定其最终结果值:

	let p = Promise.resolve('1')
			console.log(p);
			let p2 = Promise.resolve(new Promise((reslove, reject) => {
				// reslove('ok')
				reject('no')

			}))
5、Promise.all()

Promise.all() 静态方法接受一个 Promise 可迭代对象作为输入,并返回一个 Promise。当所有输入的 Promise 都被兑现时,返回的 Promise 也将被兑现(即使传入的是一个空的可迭代对象),并返回一个包含所有兑现值的数组。如果输入的任何 Promise 被拒绝,则返回的 Promise 将被拒绝,并带有第一个被拒绝的原因。

备注:都是成为未成功,有一个失败为失败类似&&运算

let p1 = new Promise((reslove, reject) => {
				reslove('ok')
			})

			let p2 = Promise.resolve('2')

			let p3 = Promise.resolve('3')
			let p = Promise.all([p1, p2, p3])
			console.log(p);

在这里插入图片描述

let p1 = new Promise((reslove, reject) => {
				reslove('ok')
			})

			let p2 = Promise.reject('2')

			let p3 = Promise.reject('3')
			let p = Promise.all([p1, p2, p3])

返回第一个失败的结果作为结果
在这里插入图片描述

6、Promise.race()

Promise.race() 静态方法接受一个 promise 可迭代对象作为输入,并返回一个 Promise。这个返回的 promise 会随着第一个 promise 的敲定而敲定。

备注:第一个 promise 的敲定而敲定。

let p1 = new Promise((reslove, reject) => {
				reslove('ok')
			})

			let p2 = Promise.reject('2')

			let p3 = Promise.reject('3')
			let p = Promise.race([p1, p2, p3])
			console.log(p);

在这里插入图片描述

let p1 = new Promise((reslove, reject) => {
				reslove('ok')
			})

			let p2 = Promise.reject('2')

			let p3 = Promise.reject('3')
			let p = Promise.race([p2, p1, p3])
			console.log(p);

在这里插入图片描述
天下事有难易乎?
为之,则难者亦易矣;不为,
则易者亦难矣。人之为学有难易乎?
学之,则难者亦易矣;不学,则易者亦难矣。

promise 关键问题

1.如何改变promise 的状态?

1.resolve
2.reject
3.抛出异常错误

2.promise 多个成功回调和失败的函数都会回调吗。
如果promise状态改变了,都会执行

3.promise then的结果由什么决定

有then里面回调函数决定
1.返回非Promise 成功 2.返回Promise有Promise决定最后值 3.抛出异常返回失败

let p2 = p.then(res => {
				// console.log('1=>' + res);
				// return Promise.resolve(9)
				throw '错误哈~'
				// return 1
			})
			console.log(p2);

4、promise 串联多个任务

p.then(res => {
				return new Promise((reslove, reject) => {
					reslove('ok')
				})
			}).then(v => {
				console.log(v);
			}).then(x => {
				console.log(x);
			})

5、异常穿透catch

p.then(res => {
				return new Promise((reslove, reject) => {
					reslove('ok')
					// reject('err')
				})
			}).then(v => {
				console.log(v);

				throw '错误'
			}).then(x => {
				console.log(x);
			}).catch(err => {
				console.log('catch ' + err);
			})
6、中断promise 链有且只有个方法,返回一个pending 状态的promise		
p.then(res => {
				return new Promise((reslove, reject) => {
					reslove('ok')
					// reject('err')
				})
			}).then(v => {
				console.log(v);
				return new Promise(() => {})
				// throw '错误'
			}).then(x => {
				console.log(x);
			}).catch(err => {
				console.log('catch ' + err);
			})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ORA-12541:TNS:无监听程序

1.重新配置监听 找到监听程序配置&#xff0c;右键已管理员身份运行 选择第二个&#xff1a;重新配置 这个一般没什么好选的 默认选定的协议TCP&#xff0c;继续下一步 默认的否 继续下一步&#xff0c;完成监听重新配置 之后进行测试看能否连上 2.本地Net服务名配置 …

HTML--表格

表格的基本结构 表格标题&#xff1a;caption 表格&#xff1a;table标签 行&#xff1a; tr标签 单元格&#xff1a;td标签 语法&#xff1a; <!DOCTYPE html> <html> <head> <title>这是一个标题</title><meta charset"utf-8"/&…

Nacos服务注册或发现、Nacos服务分级模型、Nacos负载均衡策略、加权负载均衡、Nacos环境隔离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nacos服务搭建&#xff0c;nacos服务注册或发现二、Nacos服务分级模型三、Nacos负载均衡策略四、Nacos注册中心&#xff08;nacos控制台配置&#xff09;-加…

初识Spring

1.Spring官网&#xff1a; 2.官网学习的顺序&#xff1a;先学Spring,再学SpringBoot,然后SpringCloud,Spring Cloud Data Flow。 3.Spring Framework界面&#xff1a; 4.github上的源代码&#xff1a; 5.进入使用说明文档&#xff1a; 主要是根据这个进行学习的。 6.我们用mave…

Vue2.脚手架

全局安装&#xff1a;npm i vue/cli -g检查是否成功安装&#xff1a;vue --version新建项目&#xff1a;vue create 项目名 通过nodejs安装的时候&#xff0c;可以直接代理和仓库&#xff0c;~/.npmrc文件内容如下&#xff1a; proxysocks5://127.0.0.1:7897 registryhttps:/…

QT周五作业

题目&#xff1a;实现简单水果的价格重量计算 点击一次水果重量1 自动计算总价 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QListWidgetItem> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

未来科技五年人工智能行业产业发展趋势最新竞争力

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是近年来快速发展的热门领域&#xff0c;被广泛应用于各个行业。随着技术的不断创新和突破&#xff0c;人工智能行业的竞争力也在不断提升。本文将分析未来科技五年人工智能行业产业发展趋势&#xff0c…

“一键倒放,创意无限!让视频剪辑成为艺术“

你是否厌倦了常规的视频播放方式&#xff0c;想要寻找一种全新的、与众不同的方式来呈现你的视频内容&#xff1f;现在&#xff0c;我们为你带来一个革命性的工具&#xff0c;让你轻松实现视频批量倒放&#xff0c;激发无限创意&#xff01; 第一步。首先&#xff0c;我们要打…

基于SpringBoot的康复中心管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

第十七周周报

文章目录 摘要目标检测锚框交并比NMS 非极大值抑制输出 文献阅读&#xff1a;SMPL: A Skinned Multi-Person Linear ModelIntroductionRelated WorkModel FormulationTraining评估动态SMPL讨论结论 总结 摘要 本周看了三维人体重建的领域&#xff0c;看了一篇SMPL的文章&#…

Windows2012部署项目

目录 1.jdk的安装 2.Tomact安装 3.MySQL安装 4.项目部署 ​5.思维导图 1.jdk的安装 将jdk从主机复制到虚拟机里面&#xff0c;然后双击进行安装 安装完JDK之后&#xff0c;在系统的高级系统设置中点击环境变量&#xff0c;进行增加系统变量 变量名 : JAVA_HOME 变量值 : …

【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)

盲点问题解析之HashMap工作原理全揭秘 承接上文创建HashMap对象参考容量&#xff08;capacity&#xff09;Hashmap内部有一个机制扩容阈值&#xff08;threshold&#xff09;负载因子&#xff08;loadFactor&#xff09; HashMap存储元素的过程HashMap的put方法JDK8的扩容机制N…

一键批量翻译,文件夹名称翻译器

文件夹名称往往是我们初步了解文件内容的重要窗口。有时&#xff0c;为了更好地与国际合作伙伴交流或是管理个人文件&#xff0c;我们需要对文件夹名称进行翻译。传统的逐一修改方法既费时又费力&#xff0c;还要借助翻译工具。现在有了【文件批量改名高手】&#xff0c;上面的…

OpenAI ChatGPT-4开发笔记2024-06:最简Embedding

Embedding embedding直译是&#xff1a;嵌入。和实际意思有些差距。其实就是把文本转换为向量表示的过程。用“向量化”更直接&#xff0c;但这又和tensor有点儿混。它是变成向量的一个过程。 embedding 的应用领域&#xff1a; 文本分类&#xff1a; 将文本嵌入转换为向量后…

js逆向第20例:猿人学第19题乌拉乌拉乌拉

文章目录 一、前言二、定位关键参数1、JA3/TLS指纹怎么查看2、加密值长度对比三、代码实现四、参考文献一、前言 任务十九:抓取这5页的数字,计算加和并提交结果 此题在以前用python写逆向代码是存在缺陷的,直到今年有个大佬开源了curl_cffi库,并且支持 JA3/TLS 和 http2 指…

提交代码,SVN被锁定,提示:svn is already locked解决方案

今天遇到一个问题&#xff0c;svn 在提交代码的时候出现了svn is already locked&#xff0c;解决方案如下图 点击clean up 点击ok即可 来看官方对clean up的解释&#xff1a;它的作用就是查找工作拷贝中的所有遗留的日志文件&#xff0c;删除进程中工作拷贝的锁。 参考&…

也谈人工智能——AI科普入门

文章目录 1. 科普入门人工智能的定义人工智能的类型 - 弱 AI 与强 AI人工智能、深度学习与机器学习人工智能的应用和使用场景语音识别计算机视觉客户服务建议引擎数据分析网络安全 行业应用人工智能发展史![img](https://img-blog.csdnimg.cn/img_convert/66aeaaeac6870f432fc4…

网络安全B模块(笔记详解)- MYSQL信息收集

MYSQL信息收集 1.通过渗透机场景Kali中的渗透测试工具对服务器场景MySQL03进行服务信息扫描渗透测试(使用工具Nmap,使用必须要使用的参数),并将该操作显示结果中数据库版本信息作为Flag提交; Flag:MySQL 5.5.12 2.通过渗透机场景Kali中的渗透测试工具对服务器场景MySQL0…

【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习

文章目录 RV1126芯片介绍rv1126 模块代码目录相关说明 SDK 包下的脚本使用build.sh 脚本使用envsetup.sh 脚本使用mkfirmware.sh 脚本使用rkflash.sh 脚本使用 U-Boot 编译和配置uboot 的配置修改编译操作 kernel 的修改编译rootfs 编译和配置buildroot 配置busybox 配置 固件打…

AI教我学编程之C#变量及实例演示

前言 在AI教我学编程之AI自刀 这篇文章中&#xff0c;我们知道了变量的基础类型&#xff0c;那么变量在C#中有什么作用呢&#xff1f;我们一起来看看吧&#xff01; 目录 重点先知 变量 变量类型 实例演示 变量声明 实例演示 提出疑问 初始化变量 自动初始化 多变量声明 实…