Generator 与 高级 Iteration

本文详细介绍了 JavaScript 中的 Generator,包括如何创建与使用,yield 的双向通信特性,以及 Generator 如何与异步操作结合。通过实例展示了 Generator 在数据流管理和异步控制流中的应用,探讨了异步可迭代对象和异步 Generator 的实现原理及使用场景。
摘要由CSDN通过智能技术生成

Generator

常规函数只会返回一个单一值(或者不返回任何值)。
而 Generator 可以按需一个接一个地返回(“yield”)多个值。它们可与 iterable 完美配合使用,从而可以轻松地创建数据流。
要创建一个 generator,我们需要一个特殊的语法结构:function*
Generator 函数与常规函数的行为不同。在此类函数被调用时,它不会运行其代码。而是返回一个被称为 “generator object” 的特殊对象,来管理执行流程。
一个 generator 的主要方法就是next()。当被调用时(译注:指next()方法),它会恢复上图所示的运行,执行直到最近的yield 语句(value可以被省略,默认为undefined)。然后函数执行暂停,并将产出的(yielded)值返回到外部代码。

next()的结果始终是一个具有两个属性的对象:
value: 产出的(yielded)的值。
done: 如果 generator 函数已执行完成则为 true,否则为 false。

在这里插入图片描述
Generator是可迭代的(译注:next() 是 iterator 的必要方法),所以我们可以使用 for…of 循环遍历它所有的值:

function* generateSequence() {
   
		  yield 1;
		  yield 2;
		  return 3;
		}
let generator = generateSequence();
for(let value of generator) {
   
		  console.log(value); // 1,然后是 2
		}

// for..of 写法是不是看起来比 .next().value 优雅多了?……但是请注意:上面这个例子会先显示 1,然后是 2,然后就没了。它不会显示 3! 这是因为当 done: true 时,for..of 循环会忽略最后一个 value。因此,如果我们想要通过 for..of 循环显示所有的结果,我们必须使用 yield 返回它们:

function* generateSequence() {
   
		  yield 1;
		  yield 2;
		  yield 3;
		}
let generator = generateSequence();
for(let value of generator) {
   
		  console.log(value); // 1,然后是 2,最后是 3
		}

因为 generator 是可迭代的,我们可以使用 迭代器(iterator )的所有相关功能,例如:spread 语法

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

let sequence = [0, ...generateSequence()];
console.log(sequence);  // [0, 1, 2, 3]

使用generator进行迭代

// 先回忆一下可迭代对象的方法,让range:{ from: 1, to: 5 }对象可迭代,也就是可以使用for...of
let range = {
   
  from: 1,
  to: 5,
  // for..of range 在一开始就调用一次这个方法
  [Symbol.iterator]() {
   
    // ...它返回 iterator object:
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值