SOURCE

// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Iterators_and_Generators  

// 这里生成器的next有两个作用,一个next一个返回上次的结果值

// 这里不添加动态作用域,直接使用函数式做法..,但是会引入一点副作用。

function yieldRun(generator) {
  
  /// js解释器 ---> ast
  var iterator = generator();
  run(iterator, undefined);
  //
}


function run(it, lastValue) {
  var result = it.next(lastValue);
  if (result.done) {
    return;
  }
  Promise.resolve(result.value).then(function(res) {
 	run(it, res);   
  });
}



function* g() {
  var a = 1;
  var b = yield 2;
  console.log(222);
  var c = yield a + b;
  console.log(c);
  var d = yield new Promise(function(resolve) {
    setTimeout(resolve, 1000, 18);
  }).then(function(res){
    console.log(res);
    return 23;
  });
  console.log(d)
  var e = yield 56;
}


function yieldRun2(generator) {
  var iterator = generator();
  run2(iterator, undefined);
}

function run2(it, lastValue) {
  // next 一个返回值用于给当前的var= 等号前的变量赋值。
  var result = it.next(lastValue);
  
  if (result.done) {
    return;
  }
  var temp = result.value;
  if (typeof temp === 'function') {
		temp(function(v) {
      run2(it, v);
    })
  } else {
    run2(it, temp);
  } 
}

function *g2() {
  var c = 1000;
  console.log(1);
  var a = yield function(fn) {
    setTimeout(function() {
      fn(1000);
    }, 1000)
  }
  console.log(a);
}

yieldRun(g)















console 命令行工具 X clear

                    
>
console