ES6基础教程(第十二节)——Generator函数
今天来学点新玩意,Generator函数,Generator函数是一种特殊的函数,可以使用关键字 yield和 next()实现暂停和继续执行,而关键字yield*专门用于调用Generator函数,看似简单的特性,在实际开发中却有极大的用处。学习 Generator函数的前提是iterator遍历器,如果还不了解iterator遍历器的同学可以回看以前的教程。
Generator函数的中文名字叫生成器函数,是es6的一个重要新特性,我们来看个例子:
//声明一个Hello的Generator函数
function* Hello(name) {
yield `hello ${name}`;
yield `how are you`;
yield `bye`;
}
从例子中可以看出生成器函数有两个非常重要的区别:
1.普通函数用function来声明,Generator函数用function*声明;
2.Generator函数内部有新的关键字:yield,普通函数没有。
由此也会带来来个疑问:
1.Generator函数调用起来会发生声明;
2.关键字yield语句的作用是什么。
待着疑问我们来进一步探究 Generator函数:
//声明一个Hello的Generator函数
function* Hello(name) {
yield `hello ${name}`;
yield `how are you`;
yield `bye`;
}
//调用Hello函数
let ite = Hello('大佬');
//结果:[object Generator]
ite.next();
//{value: "hello 大佬", done: false}
ite.next();
//{value: "how are you", done: false}
ite.next();
//{value: "bye", done: false}
ite.next();
//{value: undefined, done: true}
如果是了解iterator遍历器的是不是很熟悉。
Generator函数被调用后得到的生成器理解成一个遍历器iterator,用于遍历函数内部的状态。
yield在这里起到了十分重要的作用,就相当于暂停执行并且返回信息。有点像传统函数的return的作用,但不同的是普通函数只能return一次,但是Generator函数可以有很多个yield。而return代表的是终止执行,yield代表的是暂停执行,后续通过调用生成器的 next()方法,可以恢复执行。
关键字yield*:
在一个Generator函数里面,如果我们想调用另一个Generator函数,就需要用到的关键字是:yield*。
来个栗子:
//声明Generator函数:gen1
function* gen1() {
yield "gen1 start";
yield "gen1 end";
}
//声明Generator函数:gen2
function* gen2() {
yield "gen2 start";
yield "gen2 end";
}
//声明Generator函数:start
function* start() {
yield "start";
yield* gen1();
yield* gen2();
yield "end";
}
//调用start函数
var ite = start();
//创建一个生成器
ite.next();
//{value: "start", done: false}
ite.next();
//{value: "gen1 start", done: false}
ite.next();
//{value: "gen1 end", done: false}
ite.next();
//{value: "gen2 start", done: false}
ite.next();
//{value: "gen2 end", done: false}
ite.next();
//{value: "end", done: false}
如果一个Generator函数A执行过程中,进入(调用)了另一个Generator函数B,那么会一直等到Generator函数B全部执行完毕后,才会返回Generator函数A继续执行。
综上所述:
以上就是对Generator函数的讲解介绍,它是ES6的一个很重要的新特性。它可以控制函数的内部状态,依次遍历每个状态;可以根据需要,轻松地让函数暂停执行或者继续执行。
根据这个特点,我们可以利用Generator函数来实现异步操作的效果。
原理是:利用Generator函数暂停执行的作用,可以将异步操作的语句写到yield后面,通过执行next方法进行回调。
公众号