ES6之生成器

news/2024/12/2 14:38:56/

文章目录

  • 前言
  • 一、生成器是什么?
  • 二、生成器
  • 总结


前言

生成器


一、生成器是什么?

生成器就是一个特殊的函数,实现异步编程。格式function *名称(){...}
(这个*靠近function写,靠近名称写,或者两边空格都不靠近均正确)

二、生成器

  1. 生成器函数声明比较特殊:特殊在声明用*,而且该函数有iterator实现接口,是迭代器对象
<!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* dr() {console.log("a");}let iterator = dr();console.log(iterator);</script>
</body></html>

在这里插入图片描述

  1. 生成器执行用next
        function* dr() {console.log("a");console.log("b");}let iterator = dr();iterator.next();

在这里插入图片描述

  1. 生成器函数执行后的返回对象
    既然上面说它是迭代器对象,它调用next的工作原理跟迭代器的相似:next每调用一次,指针就往后移动一位;返回的是包含value,done属性的对象。
    只不过它的next移动只有函数里设置yield时,才会实现next分层执行(可以理解为yield是函数代码分隔符,下面的代码:yield “111”,yield "222"把代码分成三部分,第一部分是yield "111"及上面,第二部分是yield "111"与yield “222"之间包括yield"222”,第三部分是yield "222"下面)。
    否则默认全部为一次执行(即上面的图片执行结果)
    (如果对迭代器不熟的,可以看我上篇文章)
    next的返回结果的value是yield的值
    next调用时,就是每调用一次运行上面所说的分成的部分
	function* dr() {console.log("a");yield "111";console.log("b");yield "222";console.log("c");}let iterator = dr();console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());

在这里插入图片描述

  1. 生成器传参(生成器函数传参和next传参)
    注意:next传参是改变上一个yield … 的返回结果
	function* dr(arg) {console.log(arg);let one = yield "111";console.log(one);yield "222";console.log("c");}let iterator = dr("aaa");console.log(iterator.next());console.log(iterator.next("bbb"));console.log(iterator.next());

在这里插入图片描述

  1. 实例
    模拟:1s后获取用户数据,2s后获取订单信息,3s后获取商品信息
		<!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 getUsers() {setTimeout(() => {let data = "用户数据";iterator.next(data);}, 1000)}function getOrders() {setTimeout(() => {let data = "订单信息";iterator.next(data);}, 2000)}function getGoods() {setTimeout(() => {let data = "商品数据";iterator.next(data);}, 3000)}function* dr() {let user = yield getUsers();console.log(user);let order = yield getOrders();console.log(order);let good = yield getGoods();console.log(good);}let iterator = dr();iterator.next();</script>
</body></html>

在这里插入图片描述


总结

以上就是生成器的介绍,希望对大家有所帮助。


http://www.ppmy.cn/news/78615.html

相关文章

1142 Maximal Clique(50行代码+超详细注释)

分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one …

一分钟带你了解网络安全(如何自学)

一、关于网络安全职业 早些年&#xff0c;网络安全刚起步&#xff0c;作为一个网络安全从业人员&#xff0c;最苦恼的事情就是每当回到村里变成狗蛋儿的时候&#xff0c;七大姑八大姨&#xff0c;邻里乡亲&#xff0c;村子里的各种人都会来找你&#xff0c;狗蛋儿&#xff0c;你…

对Android 说Hello ——Qt For Android

1. Qt 安卓环境搭建 平台&#xff1a;Qt5.15.2 官网教程&#xff1a; Getting Started with Qt for Android | Qt 5.15 网上的教程&#xff1a; qt5.15.2配置android_加油吧&#xff0c;小杜的博客-CSDN博客 注意 &#xff1a;注意ndk的路径中不能有空格&#xff0c;我之前…

一、尚医通预约下单

文章目录 一、预约下单1、需求分析1.1订单表结构1.2下单分析 2、搭建service-order模块2.1 搭建service-order模块2.2 修改配置2.3 启动类2.4配置网关 3、添加订单基础类3.1 添加model3.2 添加Mapper3.3 添加service接口及实现类3.4 添加controller 4、封装Feign调用获取就诊人…

CPU和GPU前端的应用

1、CPU&#xff08;英文Central Processing Unit 中央处理器&#xff09; CPU&#xff08;中央处理器&#xff09;是一种通用的处理器&#xff0c;其主要任务是执行计算机程序中的指令和序列。它能够处理复杂的逻辑判断、分支、跳转、内存访问等操作&#xff0c;因此在执行大多…

面试:CSS清除浮动的方式

添加额外标签 <div class"parent">//添加额外标签并且添加clear属性<div style"clear:both"></div>//也可以加一个br标签 </div> 父级添加overflow属性&#xff0c;或者设置高度建立伪类选择器清除浮动 //在css中添加:after伪元素…

「 计算机网络 」TCP的粘包拆包问题

「 计算机网络 」TCP的粘包/拆包问题 参考&鸣谢 大病初愈&#xff0c;一分钟看懂TCP粘包拆包 雷小帅 TCP 的粘包拆包以及解决方案 一乐说 文章目录 「 计算机网络 」TCP的粘包/拆包问题一、前言二、为什么UDP没有粘包三、粘包拆包发生场景四、常见的解决方案五、Netty对粘包…

爬虫Requests库是什么,怎么用?

Requests库是Python中一个非常流行的HTTP请求库&#xff0c;它可以方便地发送HTTP请求并处理响应。在本文中&#xff0c;我们将介绍Requests库的基本用法&#xff0c;包括发送GET和POST请求、设置请求头、处理响应等。 一、安装Requests库 在使用Requests库之前&#xff0c;我…