当前位置: 首页 > news >正文

【ES6复习笔记】生成器(11)

什么是生成器函数

生成器函数是一种特殊的函数,它可以在执行过程中暂停并保存当前状态,然后在需要时恢复执行。生成器函数通过 yield 关键字来实现暂停和恢复执行的功能。

生成器函数的基本用法

  1. 定义生成器函数:使用 function* 关键字来定义生成器函数。
  2. 使用 yield 关键字:在生成器函数中使用 yield 关键字来返回一个值,并暂停函数的执行。
  3. 创建迭代器对象:通过调用生成器函数来创建一个迭代器对象。
  4. 使用 next() 方法:使用迭代器对象的 next() 方法来恢复生成器函数的执行,并获取下一个值。

生成器函数的实例

实例 1:基本的生成器函数

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>生成器</title>
</head>
<body><script>// 生成器函数function* gen() {yield '一只没有耳朵';yield '一只没有尾巴';yield '真奇怪';}// 创建迭代器对象let iterator = gen();// 使用 next() 方法获取值console.log(iterator.next()); // { value: '一只没有耳朵', done: false }console.log(iterator.next()); // { value: '一只没有尾巴', done: false }console.log(iterator.next()); // { value: '真奇怪', done: false }console.log(iterator.next()); // { value: undefined, done: true }</script>
</body>
</html>

实例 2:使用生成器函数实现异步操作

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>生成器函数实例</title>
</head>
<body><script>// 模拟异步获取数据function getUsers() {setTimeout(() => {let data = '用户数据';iterator.next(data);}, 1000);}function getOrders() {setTimeout(() => {let data = '订单数据';iterator.next(data);}, 1000);}function getGoods() {setTimeout(() => {let data = '商品数据';iterator.next(data);}, 1000);}// 生成器函数function* gen() {let users = yield getUsers();let orders = yield getOrders();let goods = yield getGoods();}// 创建迭代器对象并开始执行let iterator = gen();iterator.next();</script>
</body>
</html>

实例 3:使用生成器函数处理回调地狱

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>生成器函数实例</title>
</head>
<body><script>// 异步函数function one() {setTimeout(() => {console.log(111);iterator.next();}, 1000);}function two() {setTimeout(() => {console.log(222);iterator.next();}, 2000);}function three() {setTimeout(() => {console.log(333);iterator.next();}, 3000);}// 生成器函数function* gen() {yield one();yield two();yield three();}// 创建迭代器对象并开始执行let iterator = gen();iterator.next();</script>
</body>
</html>

生成器函数的参数传递

生成器函数可以接受参数,并且可以在 yield 表达式中使用这些参数。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>生成器函数参数</title>
</head>
<body><script>function* gen(arg) {console.log(arg);let one = yield 111;console.log(one);let two = yield 222;console.log(two);let three = yield 333;console.log(three);}// 执行生成器函数并传递参数let iterator = gen('AAA');console.log(iterator.next());console.log(iterator.next('BBB'));//next中传入的BBB将作为yield 111的返回结果console.log(iterator.next('CCC'));//next中传入的CCC将作为yield 222的返回结果console.log(iterator.next('DDD'));//next中传入的DDD将作为yield 333的返回结果</script>
</body>
</html>

通过以上实例,你可以看到生成器函数在处理异步操作和避免回调地狱方面的强大能力。希望这些教程对你有所帮助!


http://www.mrgr.cn/news/81452.html

相关文章:

  • 观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?
  • windows 默认的消息ID有那些---我与大模型对话
  • 【开源】一款基于SpringBoot的智慧小区物业管理系统
  • 前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!
  • MySQL-MVCC(多版本并发控制)
  • SAP HCM insufficient authorization, no.skipped personnel nos.可能涉及的场景
  • Excel生成DBC脚本源文件
  • 【EtherCATBasics】- KRTS C++示例精讲(2)
  • 【汇编】关于函数调用过程的若干问题
  • ubuntu22.04上安装win10虚拟机,并采用noVNC+frp,让远程通过web访问桌面
  • pip离线批量安装时报错No matching distribution found for【解决方案】
  • 【ES6复习笔记】箭头函数(5)
  • vulnhub靶场(Os-hacknos-3)
  • 【ES6复习笔记】模板字符串(3)
  • 【C++】设计模式
  • FreeSql
  • 【Rust自学】7.1. Package、Crate和定义Module
  • 【ES6复习笔记】函数参数的默认值(6)
  • 【Rust自学】6.4. 简单的控制流-if let
  • 【ES6复习笔记】let 和 const 命令(1)
  • 【ES6复习笔记】Promise对象详解(12)
  • 重温设计模式--5、职责链模式
  • 实现 QTreeWidget 中子节点勾选状态的递归更新功能只影响跟节点的状态父节点状态不受影响
  • 单片机:实现可调时钟(附带源码)
  • MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)
  • Python|Pyppeteer实现自动化获取reCaptcha验证码图片以及提示词(29)