ES6新增语法(六)——Generator函数详解

本文介绍了ES6中的Generator函数,它是如何通过yield实现异步任务暂停和控制的,以及与Promise的区别,包括定义方式、调用方式和优缺点。通过实例展示了Generator函数的使用方法和yield特性,如传参、返回值和return方法的应用。
摘要由CSDN通过智能技术生成

上篇文章《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提供的一种异步编程解决方案,解决了两大问题:

  • 回调地狱
  • 异步流控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值