前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航

ES6系列之Generator

首页
2018-12-21 16:20:31
Front-End
ES6Javascript

# 一、什么是Generator 函数

# 1.1 语法

学习 Generator 语法,你需要了解function* 、yield、next三个基本概念。

  • function* 用来声明一个函数是生成器函数,它比普通的函数声明多了一个*,*的位置比较随意可以挨着 function 关键字,也可以挨着函数名
  • yield 产出的意思,这个关键字只能出现在生成器函数体内,但是生成器中也可以没有 yield 关键字,函数遇到 yield 的时候会暂停,并把 yield 后面的表达式结果抛出去
  • next作用是将代码的控制权交还给生成器函数
// 声明生成器函数
function* generator() {
    // A
    yield 'foo'
    // B
}
// 获取生成器对象
let g = generator();
// 第一个 next(),首次启动生成器
g.next(); // {value: "foo", done: false}
// 唤醒被 yield 暂停的状态
g.next();
// {value: undefined, done: true}
@前端进阶之旅: 代码已经复制到剪贴板

# 1.2 过程分析

// 分析一个简单例子
function* helloGenerator() {
   yield "hello";
   yield "generator";
   return;
}

var h = helloGenerator();

console.log(h.next());//{ value: 'hello', done: false }
console.log(h.next());//{ value: 'generator', done: false }
console.log(h.next());//{ value: 'undefined', done: true }
@前端进阶之旅: 代码已经复制到剪贴板
  • 创建了h对象,指向helloGenerator的句柄
  • 第一次调用next(),执行到"yield hello",暂缓执行,并返回了"hello"
  • 第二次调用next(),继续上一次的执行,执行到"yield generator",暂缓执行,并返回了"generator"。
  • 第三次调用next(),直接执行return,并返回done:true,表明结束

经过上面的分析,yield实际就是暂缓执行的标示,每执行一次next(),相当于指针移动到下一个yield位置

总结一下,Generator函数是ES6提供的一种异步编程解决方案。通过yield标识位和next()方法调用,实现函数的分段执行

# 1.3 yield 表达式

fe
  • 一、什么是Generator 函数
    • 1.1 语法
    • 1.2 过程分析
    • 1.3 yield 表达式
  • 二、Generator应用场景
    • 2.1 异步操作的同步化表达
    • 2.2 控制流管理
    • 2.3 部署 Iterator 接口
  • 三、更多参考

← ES6系列之Async/awaitES6系列之Symbol →