// generator的手写应该分为两部分
// 一是,声明了generator的函数被编译后的结果
// 二是,generator函数部分
// 手写是需要注意,generator通过闭包的方式维护了一个对象变量
// 这个对象,有下一次case的值,还有一个stop函数
//原generator函数
//function* test(){
// let a = 1+2;
// yield 2;
// yield 3;
//}
// console.log(b.next()); // > { value: 2, done: false }
// console.log(b.next()); // > { value: 3, done: false }
// console.log(b.next()); // > { value: undefined, done: true }
function generator(babelAfter){
return (function(){
var obj = {
nextCase: 0,
stop: function(){}
}
return {
next: function(){
let ret = babelAfter(obj)
if(ret === undefined) return {value: undefined, done: true}
return {value: ret, done: false}
}
}
})()
}
// 经过babel编译后的test方法
function test(){
let a
return generator(function(_content){
while(1){
switch(_content.prev = _content.nextCase){
case 0:
a = 1 + 2
_content.nextCase = 1
return 2
case 1:
_content.nextCase = 2
return 3
case 2:
case 'end':
return _content.stop()
}
}
})
}
let b = test()
console.log(JSON.stringify(b.next()))
console.log(JSON.stringify(b.next()))
console.log(JSON.stringify(b.next())) // {value: undefined, done: true}
// console.log(test().next())
console