RubyLouvre / agate

灵活易用的nodejs后端框架
GNU General Public License v2.0
74 stars 21 forks source link

es6-generators #1

Open RubyLouvre opened 9 years ago

RubyLouvre commented 9 years ago
 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}
RubyLouvre commented 9 years ago

根据上面分析,我们不难理解 下面代码的执行流程

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个分步函数来处理。

RubyLouvre commented 9 years ago
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));

相当于 image

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}
}
RubyLouvre commented 9 years ago

如果子生成器函数里面存在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}

image

常用npm模块一览

https://github.com/ruanyf/articles/blob/master/2015/2015-04-04-npm-modules.md

RubyLouvre commented 9 years ago

http://deadhorse.me/slides/koa.pdf