ES6 从入门到精通 # 15:生成器 Generator 的用法

简介: ES6 从入门到精通 # 15:生成器 Generator 的用法

说明

ES6 从入门到精通系列(全23讲)学习笔记。



generator 函数


可以通过 yield 关键字将函数挂起,为了改变执行流提供了可能,同时为了做异步编程提供了方案

跟普通函数的区别:


  1. function 后面,函数名之前有个 *
  2. 只能在函数内部使用 yield 表达式,让函数挂起


function * func() {
  yield 3;
  yield 1;
  yield 2;
}
// 返回一个遍历器,可以调用 next()
let kaimo = func();
console.log(kaimo)
console.log(kaimo.next())
console.log(kaimo.next())
console.log(kaimo.next())
console.log(kaimo.next())

4a38f8fbcd34488e97252fa98a883fb0.png


总结:generator 函数是分段执行的,yield 语句是暂停执行,而 next() 恢复执行

function * func() {
  console.log("start")
  let x = yield 3;
  console.log("x-->", x)
  let y = yield 1;
  console.log("y-->", y)
  let z = yield 2;
  console.log("z-->", z)
  return x + y + z;
}
let kaimo = func();
console.log(kaimo.next(10))
console.log(kaimo.next(20))
console.log(kaimo.next(30))
console.log(kaimo.next(40))
console.log(kaimo.next(50))


125cfed533ae494b96329876575612f2.png

这里的 let x = yield 2; 表达式里的 x 不是 yield 2 返回值,它是 next() 调用恢复当前 yield 执行传入的实参。所以这里的 x 是 20。



使用场景

为不具备 iterator 接口的对象提供遍历操作

function * objectEntries(obj) {
  // 获取对象的所有keys保存到数组 [name, value]
  const propKeys = Object.keys(obj);
  for(const propkey of propKeys) {
    yield [propkey, obj[propkey]]
  }
}
const kaimo = {
  name: "凯小默",
  value: "kaimo313"
}
kaimo[Symbol.iterator] =  objectEntries(kaimo);
console.log(kaimo);


ba257f30524e4791b07c37a6aa55a93d.png


遍历:

for(let [key, value] of kaimo[Symbol.iterator]) {
  console.log(key, value)
}


0c93279e5e67490ea0d366056a28cd36.png






目录
相关文章
|
2月前
ES6之生成器
ES6之生成器
|
4月前
|
前端开发
ES6之生成器(Generator)
生成器(Generator)是ES6引入的一种特殊的函数,它可以通过yield关键字来暂停函数的执行,并返回一个包含value和done属性的对象。生成器的概念、作用和原理如下所述:
32 0
|
6天前
|
JavaScript 前端开发
js开发:请解释什么是ES6的Generator函数,以及它的用途。
ES6的Generator函数是暂停/恢复功能的特殊函数,利用yield返回多个值,适用于异步编程和流处理,解决了回调地狱问题。例如,一个简单的Generator函数可以这样表示: ```javascript function* generator() { yield 'Hello'; yield 'World'; } ``` 创建实例后,通过`.next()`逐次输出"Hello"和"World",展示其暂停和恢复的特性。
16 0
|
5月前
ES6学习(九)—Generator 函数的语法
ES6学习(九)—Generator 函数的语法
|
11月前
|
Python
【Python】创建生成器generator
【Python】创建生成器generator
37 0
|
11月前
|
前端开发
【ES6新特性】— Generator
【ES6新特性】— Generator
58 0
|
API
ES6 从入门到精通 # 16:Generator 的应用
ES6 从入门到精通 # 16:Generator 的应用
75 0
ES6 从入门到精通 # 16:Generator 的应用
|
大数据 PHP 数据库
Generator 生成器|学习笔记
快速学习 Generator 生成器
192 0
Generator 生成器|学习笔记
|
设计模式 存储 JavaScript