ES6 Generator和Promise

目录

Generator

如何创建Generator函数 ?

模拟发起异步请求

Promise

实例化

实例方法

工厂函数

静态方法

Promise.all([p1,p2,....])  

Promise.race([p1,p2,....])

Promise.any([p1,p2,....])

Promise.allSettled([p1,p2,....])


Generator

Generator是ES6提供的一种异步编程解决方案,语法不同于普通函数;简单的把Generator 理解为一个状态机,封装了多个内部状态。执行Generator 函数会返回一个迭代器对象,可以通过调用迭代器next依次遍历Generator函数内部的每一个状态。

如何创建Generator函数 ?

每个状态之间都是独立的

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>/*** generator 函数 也是一种异步编程的解决方案 理解为状态机 内部封装多个状态* 调用generator 函数返回值是迭代器对象 每调用一次迭代器next方法 就会执行一个状态* 特征:*  1.function 和函数名之间使用*  靠前靠后不靠都可以*  2.返回一个迭代器对象   并且内部状态使用yiled表达式* * generator函数内部使用yield表达式 一个yield就是一个状态 一个yield就是一个代码节点通过迭代器对象的next方法控制的代码的向下执行。*/function * generator(){yield '1';yield '2';yield '3';}let res = generator();console.log(res.next());for(let key of res){console.log(key);}</script>
</body>
</html>

因为return会阻止后面的代码运行,所以 Generator提供了yield,yiled也是返回值,但是执行一次状态停在了第一个yield ,依次执行next方法,执行下一个yield状态。代码分段执行,一个yield分一段。上一个yield结束是下个状态的开始,下一个状态的结束再执行下一个yield。yield后面的是返回值。最后一个yield可以return返回。

模拟发起异步请求

拿到第一个状态的返回结果再执行第二个状态,状态之间数据传递通过next

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>/*** 想要在第二个状态执行的时候调用第一个状态的返回值 * 一个yield就是一个状态 一个yield就是一个代码运行节点 * 迭代器对象每次调用next只会执行一个状态* 迭代器对象调用next方法 执行第一个状态产生返回值 在第二个状态中是接收不到 * 可以在第二个状态中传递参数 返回值接收的就是什么参数 */function* generator(){// 发送一个请求 log();let res = yield '1';console.log(res,'第一个状态返回值');yield '2';}let res = generator();// 发起第一个状态的执行res.next();// 发起第二个状态的执行// 如果想要在第二个状态中获取第一个状态返回值 需要在第二段状态执行的时候传递参数res.next(100);// 模拟异步请求function log(){for(let i=0;i<=10;i++){console.log(i)}}</script>
</body>
</html>

如果想要实现数据传递 需要发起第二段程序执行   拿上一个状态得返回值作为下一个状态得入口

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.bootcdn.net/ajax/libs/axios/1.3.6/axios.js"></script>
</head>
<body><script>function *generator(){// 每一个代码节点发起异步请求 let res = yield getData();console.log(res,'第一个异步请求的返回值');yield '结束了';}let res = generator();res.next();// 封装一个异步函数async function getData(){let result = await axios.get('http://121.199.0.35:8888/index/carousel/findAll');// result 异步请求的返回值 后端返回的数据 result.dataconsole.log(result,'响应数据');// 在第一个状态的异步函数中发起第二段状态执行 并且把第一个状态产生返回值当做下一个状态的入口res.next(result.data);}</script>
</body>
</html>

 

Promise

Promise是一种异步编程解决方案,Promise是一个容器,保存着将来才会执行的代码;从语法角度来说Promise是一个对象,可以用来获取异步操作的消息。异步操作,同步解决,避免了层层嵌套的回调函数,可以链式调用降低了操作难度。

实例化

Promise构造函数接收一个函数作为参数,也就是回调函数;

该函数的两个参数分别是resolve和reject。resolve作为成功的回调函数,reject作为失败的回调函数。

Promise对象代表一个异步操作有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。最后返回resolved(已定型)结果。

实例方法

定义在Promise.prototype中的方法,通过Promise实例可以直接调用
then(res=>{}) 状态由pending变为fulfilled的时候也就是异步操作成功之后执行该回调函数
参数:回调函数,回调函数的参数为resolve函数传递过来的值
返回值:返回一个新的Promise实例对象,因此可以使用链式调用
catch(err=>{}) 由pending变为rejected的时候执行该回调函数也就是异步失败之后执行该回调函数
参数:回调函数,回调函数的参数为reject函数传递过来的值
返回值:返回一个新的Promise实例对象,因此可以使用链式调用
finally()无论异步操作执行成功失败与否,都会执行该回调
参数:回调函数
返回值:返回一个新的Promise实例对象

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=s, initial-scale=1.0"><title>Document</title>
</head>
<body><script>// 创建promise实例对象 参数 回调函数let promise = new Promise((resolve,reject)=>{/*** resolve 是成功的回调函数* reject 是失败的回调函数* 不发送请求 此时promise实例状态pending进行中*/// 模拟发送异步请求if(3<2){// let res = await axios.get();resolve('发送成功');}else{reject('发送失败')}});// console.log(promise);/*** promise实例状态为fullfilled走then回调* promise实例状态为rejected走catch回调*/promise.then((res)=>{console.log(res);}).catch((error)=>{console.log(error);}).finally(()=>{console.log('最终状态');})/*** then方法提供了两个回调函数 * 第一个回调函数是成功的回调 第二个回调函数是失败的回调 * resolve reject*/promise.then((res)=>{console.log(res);},(error)=>{console.log(error);})</script>
</body>
</html>

 

考虑到需要创建多个promise实例对象 这些对象封装ajax请求

使用工厂函数创建promise实例对象

工厂函数

在下面静态方法的代码中

静态方法

Promise.all([p1,p2,....])  

参数:数组 [多个promise实例] 返回值:promise实例 实例状态

每一个请求实例为fullfilled,才是fullfilled。否则是rejected

Promise.race([p1,p2,....])

参数:数组 [多个promise实例] 返回值:返回先请求成功的实例 返回的也是promise实例对象

Promise.any([p1,p2,....])

参数:数组 [多个promise实例] 返回值:返回任意一个成功的实例

Promise.allSettled([p1,p2,....])

参数:数组 [多个promise实例] 返回值:promise实例

每一个请求实例为rejected,才是rejected。否则是fullfilled

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script>function promise(method, url) {return new Promise((resolve, reject) => {// 创建一个请求实例let xhr = new XMLHttpRequest();// 打开链接xhr.open(method, url);// 发送请求xhr.send();// 接收响应xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status === 200) {resolve(JSON.parse(xhr.response));} else {reject('接收失败');}}}});}let p1 = promise('get', 'http://121.199.0.35:8888/index/category/findAll');let p2 = promise('get', 'http://121.199.0.35:8887/index/carousel/findAll');// p1.then((res) => {//     console.log(res, 'res接收成功');// }).catch((error) => {//     console.log(error, '出现错误');// })// p2.then((res) => {//     console.log(res, 'res接收成功');// }).catch((error) => {//     console.log(error, '出现错误');// })// 静态方法 同时发送多个请求// Promise.all([p1,p2,....]) 参数:数组 [多个promise实例] 返回值:promise实例 实例状态// 每一个请求实例为fullfilled,才是fullfilled。否则是rejectedlet res = Promise.all([p1,p2]);// Promise.race([p1,p2,....])   参数:数组 [多个promise实例] 返回值:返回先请求成功的实例 返回的也是promise实例对象// let res = Promise.race([p1,p2]);// Promise.any([p1,p2,....])  参数:数组 [多个promise实例] 返回值:返回任意一个成功的实例// let res = Promise.any([p1,p2]);// Promise.allSettled([p1,p2,....]) 参数:数组 [多个promise实例] 返回值:promise实例// 每一个请求实例为rejected,才是rejected。否则是fullfilled// let res = Promise.allSettled([p1,p2])console.log(res);       //promise实例 实例状态 res.then((res)=>{console.log(res,'all方法res接收的是数组');}).catch((error)=>{console.log(error);})</script>
</body></html>

 

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

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

相关文章

云计算与大数据——MPI集群配置

什么是MPI集群&#xff1f; MPI&#xff08;消息传递接口&#xff09;是一种用于编写并行程序的标准&#xff0c;它允许在多个计算节点上进行通信和协作。MPI集群配置是指在一个或多个计算节点上设置MPI环境以实现并行计算。 MPI集群配置的步骤&#xff1a; 硬件选型&#x…

C++--day3(内联函数、结构体、类、封装、this、构造函数、析构函数)

#include <iostream>using namespace std;class My_stack { private:int *ptr; //指向堆区空间int top; //记录栈顶元素int size; public://有参构造My_stack(int size):ptr(new int[size]),top(-1){this->sizesize;cout<<"My_stack::有参构造&…

Django MultiValueDictKeyError 表单数据用request.POST 非表单数据用request.body

表单数据&#xff1a;Content-Type(请求头)为application/x-www-form-urlencoded的数据。 用request.POST获取 a request.POST.get(a) a request.POST[a] alist request.POST.getlist(a) 非表单数据&#xff1a;Content-Type(请求头)为非application/x-www-form-urlenco…

2023年郑州/杭州/深圳CSPM-3中级国标项目管理认证招生

CSPM-3中级项目管理专业人员认证&#xff0c;是中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;&#xff0c;面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系&#xff0c;建立健全人才职业能力评价和激励机制的要…

【动态内存错误详解和C的内存分区】

常见的动态内存错误 1.动态内存错误2.经典案例分析2.1案例一2.1.1**问题分析**2.1.2**修改错误** 2.2案例二2.2.1 原因分析2.2.2 解决问题 c/c内存分布1.2 内存分区简介1.2.1 栈区(stack)1.2.2 堆区(heap)1.2.3 全局(静态)区1.2.4 常量区1.2.5 代码区 1.动态内存错误 &#xf…

Argo CD 入门扫盲使用

目录 一、什么是 argo cd 二、为什么使用 argo cd 三、argo cd 架构图 四、Argo CD 使用 1、安装 Argo CD 2、安装 Argo CD CLI 3、发布 Argo CD 服务 4、获取 Argo CD 密码 5、准备 Git 仓库 6、创建 Argo CD App 7、版本升级 8、版本回滚 一、什么是 argo cd A…

STM32学习笔记(十三)丨USART通用同步/异步收发器(串口外设的基本使用丨串口发送数据、串口发送+接收数据)

本篇文章包含的内容 一、STM32的USART外设1.1 STM32的USAER外设简介1.2 USART外设的结构和工作原理1.3 串口通信数据帧1.4 起始位侦测和USART的噪声判断机制1.5 波特率发生器 二、串口发送和接收数据包2.1 HEX数据包2.2 文本数据包2.3 固定包长HEX数据包接收2.4 可变包长文本数…

简单认识MySQL数据库日志和数据的备份恢复

文章目录 Mysql 备份与还原一、数据备份的重要性二、数据库备份类型1 、物理备份2 、逻辑备份 三、常见的备份方法1、 物理冷备2、 专用备份工具 mysqldump 或 mysqlhotcopy3、 启用二进制日志进行增量备份3.4 第三方工具备份 四、MySQL完全备份1、简介2、优点&#xff1a;3、缺…

SAP ABAP 报表程序实现下载文件及上传 Excel 并解析

步骤1&#xff1a; 事务代码 SMW0 选择二进制数据选项点击上方按钮。 点击新建按钮输入名称和描述&#xff0c;上传模版文件。 案例传入 EXCEL 如下&#xff1a; 创建好资源库对象结果如下。 步骤2&#xff1a;报表效果展示 点击按钮选择上传的文件。 解析 Excel 文件结果…

visual studio配置调用c++ dll opencv为例

1&#xff0c;配置VC目录&#xff0c;包含目录和库目录。 2&#xff0c;链接器->输入->包含目录 3&#xff0c;生成目录下包含对应的dll文件 4&#xff0c;需注意对应的Debug&#xff0c;Release及X86&#xff0c;X64选项

创建型模式 - 建造者模式

概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。 由于实现了构建和装配的解耦。…

Java基础---常用类大全以及各数据结构的方法大全

目录 前言 一、Math类 二.Scanner类 三、String类、StringBuilder和StringBuffer类 &#x1f496;String类 &#x1f496;StringBuilder和StringBuffer 四.Arrays类 五.Random类 六.时间类 七.ArrayList顺序表 八、LinkedList与链表 九.Stack栈和Queue队列 十.Pri…