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

Generator 是怎么样使用的以及各个阶段的变化如何

Generators 是 JavaScript 中一种特殊类型的函数,可以在执行过程中暂停,并且在需要时恢复执行。它们是通过 function* 关键字来定义的。Generator 函数返回的是一个迭代器对象,通过调用该迭代器对象的 next() 方法来控制函数的执行。在调用 next() 方法时,Generator 函数会执行到下一个 yield 关键字所在的位置,然后将 yield 后面的表达式的值作为返回的对象的 value 属性的值。下面是一个简单的 Generator 函数示例:

javascript复制代码function* generatorFunction() {console.log('Step 1');yield 1;console.log('Step 2');yield 2;console.log('Step 3');return 3;
}
​
const iterator = generatorFunction();
​
console.log(iterator.next()); // 输出: { value: 1, done: false }
console.log(iterator.next()); // 输出: { value: 2, done: false }
console.log(iterator.next()); // 输出: { value: 3, done: true }

上面的示例中,generatorFunction 是一个 Generator 函数,它包含了三个 yield 关键字。调用 generatorFunction 返回的是一个迭代器对象 iterator。然后通过调用 iterator.next() 方法来控制 Generator 函数的执行。Generator 函数会执行到下一个 yield 关键字所在的位置,并返回一个对象,其中 value 属性表示 yield 后面表达式的值,done 属性表示 Generator 函数是否已经执行完毕。

Generator 函数的执行过程可以分为以下几个阶段:

  1. 初始化阶段

    • Generator 函数被调用后,会返回一个指向内部状态的迭代器对象,但并不执行函数体内的代码,这个过程称为初始化阶段。

  2. 第一次调用 next() 阶段

    • 在第一次调用迭代器对象的 next() 方法时,Generator 函数会从函数体开始执行,直到遇到第一个 yield 关键字为止。然后返回 yield 关键字后面表达式的值,并暂停函数的执行。

  3. 后续调用 next() 阶段

    • 在后续调用迭代器对象的 next() 方法时,Generator 函数会从上一次 yield 关键字暂停的地方继续执行,直到遇到下一个 yield 关键字或者 return 语句为止。然后返回 yield 关键字后面表达式的值,并暂停函数的执行。

  4. 完成阶段

    • Generator 函数执行到最后一个 yield 关键字或者 return 语句时,函数执行结束,迭代器对象的 next() 方法会返回一个 done 属性为 true 的对象,表示 Generator 函数执行结束。

Generator 函数的灵活性和可控性使得它在一些场景下非常有用,比如异步编程、数据流控制等

http://www.lryc.cn/news/388689.html

相关文章:

  • 一文了解Java中 Vector、ArrayList、LinkedList 之间的区别
  • 【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究
  • 【Win测试】窗口捕获的学习笔记
  • PostgreSQL的学习心得和知识总结(一百四十七)|深入理解PostgreSQL数据库之transaction chain的使用和实现
  • 宝塔linux网站迁移步骤
  • 电路笔记(三极管器件): MOSFETIGBT
  • Docker 镜像导出和导入
  • QueryClientProvider is not defined
  • HTTPS是什么?原理是什么?用公钥加密为什么不能用公钥解密?
  • 系统中非功能性需求的思考
  • 力扣第215题“数组中的第K个最大元素”
  • java.util.function实现原理和Java使用场景【Function、Predicate集合转换过滤,BiConsumer事件处理】
  • 《每天5分钟用Flask搭建一个管理系统》 第6章:数据库集成
  • pandas读取和处理Excel文件的基础应用1
  • electron vite react 创建一个项目
  • 鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
  • 湖南省教育网络协会莅临麒麟信安调研教育网络数字化建设及教育信创发展情况
  • 论文阅读_优化RAG系统的检索
  • STC8/32 软硬件I2C通讯方式扫描I2C设备地址
  • Linux——数据流和重定向,制作镜像
  • Windows 11的市场份额越来越大了,推荐你升级!
  • 微服务架构中的调试难题与分布式事务解决方案
  • 银行家算法-操作系统中避免死锁的最著名算法
  • PCL 基于点云RGB颜色的区域生长算法
  • cube-studio开源一站式机器学习平台,在线ide,jupyter,vscode,matlab,rstudio,ssh远程连接,tensorboard
  • 1976 ssm 营地管理系统开发mysql数据库web结构java编程计算机网页源码Myeclipse项目
  • 技术派全局异常处理
  • 对于mysql 故障的定位和排查
  • 什么是电航空插头插座连接器有什么作用
  • 数据挖掘常见算法(分类算法)