一、Generator的基本概念
1.定义Gernerator函数
Generator是一种函数,这种函数是ES6提出的一种异步编程
的解决方案,在它内部,使用 yield
关键字封装了一个个状态机。这个函数的执行结果,就是一个遍历器对象。
function* next() {
yield 1;
yield 2+2;
return 3;
}
var fun = next();
console.log(fun.next()); //{value: 1, done: false}
console.log(fun.next()); //{value: 4, done: false}
console.log(fun.next()); //{value: 3, done: true}
console.log(fun.next()); //{value: undefined, done: true}
Generator函数,返回的是一个遍历器对象,这个遍历器对象,拥有next方法,调用这个方法,就能得到yield关键字标识状态的结果。
2.Generator函数特征
- function 关键字和函数之间有一个星号(*),且内部使用yield表达式,定义不同的内部状态
- 调用Generator函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象
- Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行
3.异步编程
所谓 异步
,简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。
异步编程方式:
- 回调函数
- 事件监听
- 发布/订阅者
- Promise对象
所谓
回调函数
,就是把第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。回调函数的异步方式容易形成多重嵌套,多个异步操作形成了强耦合,只要有一个操作需要修改,它的上层回调函数和下层回调函数,可能都要跟着修改。这种情况就称为”回调函数地狱”(callback hell)。Promise
可以解决callback hell问题,Promise对象允许回调函数的嵌套,改成链式调用。
Generator函数之所以是一种完美的异步编程解决方案,本质上是因为它的两个特点:函数体内外的数据交换
和 完美的错误处理机制
。
二、yield 表达式
Generator 函数返回的遍历器对象,只有调用 next 方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。
1.yield 表达式就是暂停标志
yield 表达式
后面的表达式,只有当调用next
方法、内部指针指向该语句时才会执行