agate
agate copied to clipboard
es6-generators
function * foo() {
var x = "1" + (yield "foo");
console.log(x);
return 44
}
然后通过以下手段得到一个生成器实例,它有next, throw方法及done属性
var it = foo()
然后执行it.next()方法,这时它内部只执行内部第一个yield关键之后, 相当于
function foo1(){
var ret = "foo"
return { value: ret: done: false}
}
// {value: "foo": done: false}
再次执行it.next()方法,它从yield之后执行,并且将用户参数传入
function foo2(a){
var x = "1" + a
console.log(x);
var ret = 44
return { value: ret: done: true}
}
//"1undefined"
// {value: 44: done: true}
如果我们第二次不是没有传东西,而是传入4,it.next(4)
那么就变成
//"14"
// {value: 44: done: true}
根据上面分析,我们不难理解 下面代码的执行流程
function* start() {
var a = yield 'start';
console.log(a);
var b = yield 'running';
console.log(b);
var c = yield 'end';
console.log(c);
return 'over';
}
var it = start();
console.log(it.next());
console.log(it.next(22));
console.log(it.next(333));
console.log(it.next(444));
相当于
function strat1(){
return {value:"start", done: false}
}
function strat2(v){
var a = v
console.log(a);
return {value:"running", done: false}
}
function strat3(v){
var b = v
console.log(b);
return {value:"end", done: false}
}
function strat4(v){
var c = v
console.log(c);
var ret = "over"
return {value:ret, done: true}
}
就是说一个生成器函数里面包含有多少个yield,那么它就会分解成多少个加1个分步函数来处理。
function* child() {
console.log("step in child generator")
var b = yield 'running';
console.log(b+"!");
console.log("step out child generator")
}
var runGenerator = child();
function* start() {
var a = yield 'start';
console.log(a);
yield *runGenerator;
var c = yield 'end';
console.log(c);
return 'over';
}
var it = start();
console.log(it.next());
console.log("================")
console.log(it.next(22));
console.log("================")
console.log(it.next(333));
console.log("================")
console.log(it.next(444));
相当于
function start1(){
return {value:"start", done: false}
}
function start2(v){
var a = v
console.log(a)
function child(){
console.log("step in child generator")
return {value:"running", done: false}
}
return child()
}
function start3(v){
function child(v){
var b = v
console.log(b+"!");
console.log("step out child generator")
}
child()
return {value:"end", done: false}
}
function start4(v){
var c = v
console.log(c);
var ret = "over"
return {value:ret, done: false}
}
如果子生成器函数里面存在return ,那么它return到那里,以后再就会跑剩下的yield语句了
function* run() {
console.log("step in child generator");
return "child over";
var b = yield 'running';
console.log(b);
console.log("step out child generator")
}
var runGenerator = run();
function* start() {
var a = yield 'start';
console.log(a);
var childValue = yield *runGenerator;
console.log("childValue=="+childValue);
var c = yield 'end';
console.log(c);
return 'over';
}
var it = start();
console.log(it.next());
//Object {value: "start", done: false}
console.log(it.next(22));
//22
//step in child generator
//childValue==child over
//Object {value: "end", done: false}
console.log(it.next(333));
//333 Object {value: "over", done: true}
常用npm模块一览
https://github.com/ruanyf/articles/blob/master/2015/2015-04-04-npm-modules.md
http://deadhorse.me/slides/koa.pdf