ES6新增语法(六)——Generator函数详解
上篇文章《ES6新增语法(五)——Promise详解》我们介绍Promise,Promise一旦执行就无法暂停和取消,所以ES6引入了Generator函数,可以通过yield关键字,把函数的执行流程挂起,可以改变执行流程。
什么是Generator函数?
Generator主要是异步编程,用来封装异步任务,是一个异步任务的容器,可以让函数按照我们指定的时候执行或者暂停。
使用语法:
function *name(){
...
yield; //需要暂停的时候加yield
...
yield;
...
}
const p = name();
p.next() //调用函数,执行到第一个yield处停止
p.next() //从上一个yeild开始执行,到下一个yield处为止
Generator与普通函数区别
1> 定义函数的时候比普通函数多了一个 * 号。
2> 调用的时候,普通函数名后加圆括号直接调用,而Generator并不执行,返回的也不是函数运行结果,而是指向内部的状态的指针对象,必须调用遍历器对象的next()方法,使得指针移向下一个状态。每次调用next,指针就会从上一次停下的地方开始执行到下一个yield。
3> 普通函数是无法暂停的,但Generator函数是分段执行的,yield是暂停标记,而next()可以恢复执行。
generator实例如下:
function *show(){ console.log('1') yield; console.log('2') } const p = show(); p.next(); //执行第一个yield之前内容,打印1 p.next(); //执行yield之后内容,打印2
yield特点
1> 可以传参数,只能传一个参数
function *chuancan(){ console.log('1') let a = yield; console.log('a',a)//12 } const gen = chuancan(); gen.next() gen.next(12)
2> 返回值
function *fanhui(){ console.log('1'); yield 55; console.log('2'); } let fh = fanhui() let res1 = fh.next() console.log(res1) //{value: 55, done: false} let res2 = fh.next() console.log(res2) //{value: undefined, done: true}
generator函数中也可以添加 return
function *show(){ console.log('1') yield 55; console.log(2); return 89; } let gen = show(); let res1 = gen.next(); console.log(res1) //{value: 55, done: false} let res2 = gen.next(); console.log(res2) //{value: 89, done: true}
return 方法
return 方法返回给定值,并结束遍历generator函数。
return 方法提供参数时,返回该参数,不提供时,返回undefined。
Generator函数优点
Generator函数是ES6提供的一种异步编程解决方案,解决了两大问题:
- 回调地狱
- 异步流控
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?