- 基本
- generator生成的遍历器g, gSymbol.iterator得到自己。继承它prototype上的方法
- generator中this添加的属性, 生成的遍历器实例中没有, generator new相当于执行得到遍历器
- g.bind(obj) 可以改变generator中的this
- 作为对象属性时写做 {* g() {}}, {g: function* () {}}
- 应用
- 状态机
- 协程(coroutine)
- generator是半协程(semi-coroutine), 只有generator函数的调用者,才能改变程序运行状态
- 将多个协作的任务写成generator, 用yield语句交换控制权
- 异步程序同步写法
- 部署iterator接口
- 可看作数组结构
- yield
- 特点
- 惰性求值
- 在表达式中时加圆括号, 如’hello’ + (yield 1),字符串模板中
${yield}
- var n = yield i; g.next(1) 来返回值给n, g.next()返回undefined
- 第一次调用g.next()不能传值,因为执行第一个yield之前的代码, 还没有yield来接收
- var a = yield* g()
- 展开g()得到的generator(可展开所有iterator), 是for … of的一种简写形式
- g()中有return 时, a 得到return 的值
- yield [a(), b()]
- throw
- 特点
- 外部的throw语句只被外部捕获
- generator中throw的错误先内部捕获,再抛出, g.throw(1)相当于从内部yield处抛出一个错误
- generator抛出错误后不再能继续执行,再执行返回done=true
- var g = function* () {try {yield;} catch (e) {}} # 可以多个yield一个try catch , 而回调函数只能一个回调一个try catch
- var i = g(); i.next()
- try{i.throw(‘a’); i.throw(‘b’) } catch(e){} # 内部捕获a, 外部捕获b
- return
- 特点
- 相当于强制内部return
- generator中有finally时, g.return()延迟到所有finally执行后执行,再结束
- g.return(0) // {value: 0, done: true}
- 使用
- function* f () {
- yield 1; yield 2; return 3;
- }
- var ff = f(), ff.next()
- {value: 1, done: false}, {value: 2, done: false}, {value: 3, done: true}, {value: undefined, done: true}
- 没有return语句时, 去掉第三个结果,其它不变
- 自动执行 # 写执行器处理thunk和promise