JavaScript 生成器(Generator)、高级 iteration用法详解

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

目录

✨ 前言

✨ 正文

一、生成器(Generator)

什么是生成器

生成器函数

 next() 方法

生成器实例

生成器委托

总结

二、异步迭代和 generator

异步迭代器

创建异步迭代器

消费异步迭代器

异步生成器函数

自定义异步迭代对象

总结

✨ 结语


✨ 前言

        异步编程一直是JavaScript开发的难点。我们需要合理地处理代码的异步流程,避免Callback Hell的问题。

        Generator函数为我们带来了实现异步迭代的能力。通过它和高级迭代方法的配合,我们可以编写出非常优雅的异步代码。

        本文将详细介绍Generator的用法,以及它如何实现自定义的异步迭代模式。这将极大提高我们处理异步操作的能力,是每个JavaScript开发者都应当掌握的技能。

✨ 正文

一、生成器(Generator)

什么是生成器

生成器(Generator)是ES6中新增的一种异步编程解决方案。

它可以让一个函数在执行过程中多次返回值。此后,我们可以通过next()方法恢复其执行。

生成器函数

定义生成器函数需要在函数名前加星号*:

function* generateSequence() {yield 1;yield 2;return 3;
}

生成器函数可以通过yield关键字返回多次。

调用生成器函数返回一个生成器对象:

let generator = generateSequence();

 next() 方法

必须通过next()方法恢复生成器的执行:

generator.next(); // {value: 1, done: false}
generator.next(); // {value: 2, done: false} 
generator.next(); // {value: 3, done: true}

每次next()调用将执行生成器直至下一个yield语句。

生成器实例

生成器常用于封装异步操作的执行流程:

function* fetch() {let result1 = yield fetchResource1();let result2 = yield fetchResource2(result1);let result3 = yield fetchResource3(result2);return result3;}let generator = fetch();

 这里生成器允许我们清楚地表示每个异步操作步骤之间的关系。

生成器委托

我们可以编写一个执行器,自动迭代生成器:

function run(generator) {let result = generator.next();while (!result.done) {result = generator.next(result.value);}return result.value;
}run(fetch());

这种方式被称为生成器委托,是更便捷的使用生成器的方式。

总结

  • 生成器函数可以通过yield多次返回值
  • next()方法恢复生成器执行
  • 用于表示异步任务的执行步骤
  • 委托自动迭代生成器

生成器是一种强大的异步编程模式,值得我们深入学习。

二、异步迭代和 generator

异步迭代器

        异步迭代器(Async Iterable)是允许异步迭代的对象。它符合异步迭代协议,并且可以被for await...of循环使用。

        一个异步迭代器对象必须有一个Symbol.asyncIterator方法,该方法返回一个异步迭代器。

创建异步迭代器

我们可以通过生成器和异步函数来创建异步迭代器:

const fetch = require('node-fetch');async function* generateAsyncSequence() {let result = await fetch('/api');yield result;}let asyncIter = generateAsyncSequence();

这里generateAsyncSequence是一个异步生成器函数,创建了一个异步迭代器。

消费异步迭代器

可以在for await...of循环中消费异步迭代器:

for await (let item of asyncIter) {console.log(item); 
}

每次循环将await下一次yield产生的值。

也可以通过.next()方法手动异步迭代:

let item = await asyncIter.next(); 
console.log(item.value);

异步生成器函数

异步生成器函数是一个返回异步迭代器的异步函数。形式为:

async function* name([params]) {// ···yield value;// ···
}

async关键字表示这是一个异步函数。function*表示这是一个生成器。

自定义异步迭代对象

我们可以定义一个类的Symbol.asyncIterator方法来使其可异步迭代:

class Reader {constructor(url) {this.url = url;}async *[Symbol.asyncIterator]() {let response = await fetch(this.url);let reader = response.body.getReader();while(true) {let {value, done} = await reader.read();if (done) break;yield value;}return reader.closed; }}

现在这个类可以用于for await...of循环进行异步迭代。

总结

  • 异步迭代器用于异步案例下的迭代
  • 可以用生成器函数创建异步迭代器
  • for await...of可迭代异步迭代器
  • Symbol.asyncIterator方法让对象可异步迭代

异步迭代器是处理异步可迭代对象的现代方式。

✨ 结语

        Generator非常适合封装异步任务的执行流程。配合高级迭代方法,我们可以自定义强大的异步处理逻辑。

        这为JavaScript的异步编程带来了革命性的进步。如果你之前都依靠回调函数处理异步,是时候提升技能了!

        希望本文能让你对Generator和异步迭代有一个较深的理解。将它用于项目中,可以使代码的异步流程更加清晰优雅。这是你成为异步编程高手的关键一步!

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

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

相关文章

Unity 代理模式(实例详解)

文章目录 实例1:资源加载代理(Asset Loading Proxy)实例2:网络请求代理(Network Request Proxy)实例3:性能优化代理(Performance Optimization Proxy)实例4:权…

Docker容器部署OpenCV,打造高效可移植的计算机视觉开发环境

推荐 海鲸AI-ChatGPT4.0国内站点:https://www.atalk-ai.com 前言 在计算机视觉领域,快速部署和测试算法是研究和开发的关键。OpenCV作为一个强大的开源计算机视觉库,广泛应用于各种图像处理和视频分析任务。然而,配置OpenCV环境可…

光纤接口类型

光纤接口 网络设备基础知识 文章目录 光纤接口前言一、光纤接口二、光纤接口的优缺点总结前言 不同的接口类型适用于不同的光纤传输系统和应用需求。在选择光纤设备时,需要根据实际需求和系统要求选择适当的光纤接口类型。 一、光纤接口

计算机基础之微处理器简介

微处理器 微处理器定义 微型计算机的CPU也被称为微处理器,是将运算器、控制器和高速缓存集成在一起的超大规模集成电路芯片,是计算机的核心部件。能完成取指令、执行指令,以及与外界存储器和逻辑部件交换信息等操作。 微处理器发展 CPU从…

[C++]使用纯opencv部署yolov8旋转框目标检测

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 YOLOv8是一种先进的对象检测算法,它通过单个神经网络实现了快速的物体检测。其中,旋转框检测是YOLOv8的一项重要特性,它可以有效地检测出不同方向和角度的物体。…

安全小记-ngnix负载均衡

目录 一.配置ngnix环境二.nginx负载均衡 一.配置ngnix环境 本次实验使用的是centos7,首先默认yum源已经配置好,没有配置好的自行访问阿里云镜像站 https://developer.aliyun.com/mirror/ 接着进行安装工作 1.首先创建Nginx的目录并进入: mkdir /soft &…

【七、centos要停止维护了,我选择Almalinux】

搜索镜像 https://developer.aliyun.com/mirror/?serviceTypemirror&tag%E7%B3%BB%E7%BB%9F&keywordalmalinux dvd是有界面操作的,minimal是最小化只有命里行 镜像下载地址 安装和centos基本一样的,操作命令也是一样的,有需要我…

openlayers+vue实现缓冲区

文章目录 前言一、准备二、初始化地图1、创建一个地图容器2、引入必须的类库3、地图初始化4、给地图增加底图 三、创建缓冲区1、引入需要的工具类库2、绘制方法 四、完整代码总结 前言 缓冲区是地理空间目标的一种影响范围或服务范围,是对选中的一组或一类地图要素(点、线或面…

C++面试:散列表

目录 1. 散列表的基本概念 散列表的定义 散列函数 哈希冲突 2. 处理冲突的方法 链地址法(Separate Chaining) 开放地址法 再散列 3. 散列表的性能分析 1. 平均查找长度(ASL) 2. 负载因子(Load Factor&#…

【Linux】-cp模型

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

IS-IS:04 DIS

IS-IS 协议只支持两种网络类型,即广播网络和点到点网络。与 OSPF 协议相同, IS-IS 协议在广播网络中会将网络视为一个伪节点 ( Pesudonde,简称 PSN),并选举出一台DIS (Designated IS&#xff09…

ASP.NET Core 7 Web 使用Session

ASP.NET Core 好像不能像20年前那样直接使用Session函数,我使用如下方法 1、在NuGet安装以下2个包 2、在Program.cs注册 //注册Session builder.Services.AddSession(options > {options.IdleTimeout TimeSpan.FromMinutes(60);options.Cookie.HttpOnly fals…

CAN相关寄存器

1. CAN_ MCR:CAN主控制寄存器。主要负责CAN工作模式的配置。 CAN_BTR:位时序寄存器。用来设置分频/TBs1/TBs2/Tsw等参数,设置测试模式。 CAN_(T/R)IxR:标识符寄存器。存放(待发送/接收)的报文ID、扩展ID、IDE位及RTR…

如何快速搭建实用的爬虫管理平台

目录 一、前言 二、选择合适的爬虫框架 三、搭建数据库 步骤1 步骤2 步骤3 四、搭建Web服务器 步骤1 步骤2 步骤3 步骤4 五、管理爬虫 六、总结 一、前言 爬虫是互联网数据采集的关键工具,但是随着数据量的增加和需求的多样化,手动运行和管…

SIFT图像特征表述

SIFT(尺度不变特征变换)是一种用于图像处理和计算机视觉领域的特征提取算法。其目的是检测和描述图像中的局部特征。SIFT特征对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也具有一定的稳健性。下面是SIFT特征提取的基本…

计算机网络体系架构认知--网络协议栈

文章目录 一.计算机网络分层架构各协议层和计算机系统的联系从整体上理解计算机网络通信计算机网络通信的本质 二.Mac地址,IP地址和进程端口号三.局域网通信与跨局域网通信局域网通信跨局域网通信全球互联的通信脉络 四.网络编程概述 一.计算机网络分层架构 实现计算机长距离网…

12.Golang中类的表示与封装

目录 概述类的表示代码结果 类的封装代码结果 结束 概述 Golang中类的表示与封装 类的表示 代码 注释掉的代码,并不能拿来当赋值或获取值来使用。 package mainimport "fmt"// 类大写则代表,可以被其它包使用 type Hero struct {// 属性方法大…

RHCE作业

1.写一个脚本,完成如下功能 传递一个参数给脚本,此参数为gzip、bzip2或者xz三者之一 (1) 如果参数1的值为gzip,则使用tar和gzip归档压缩/etc目录至/backups目录中,并命名为/backups/etc-20160613.tar.gz; (2) 如果参…

临紧光五行护盾

临紧光五行护盾基础名词解释 粒子系统仿真,离散事件系统设计临紧光五行护盾(云藏山鹰临近光五行散射)V-ATPase道装,意气实体过程光效集聚模拟器荀况数论云藏山鹰类型物粒子系统导引云藏山鹰类型物与冯诺依曼爆炸学物品分类表杨米尔…

【华为 ICT HCIA eNSP 习题汇总】——题目集10

1、以下哪个动态路由协议不能应用在 IPv6 网络中? A、IS-IS B、RIPng C、BGP4 D、OSPFv3 考点:路由技术原理 解析:(A) IS-ISv6 是在 IPv6 环境下,IS-IS 协议进行了相应的扩展和改进,以适应 IPv6…