Javascript ES6生成器异步

axl*_*lpl 5 javascript generator ecmascript-6

我需要运行生成器异步(我需要在控制台1,2,3,4,5中导致结果现在我有4,1,2,3,5)任何人都可以帮助我吗?我需要运行任务并等待上一个任务完成后再运行下一个任务.我需要使用(如果可能的话)发电机(或发电机+承诺?)

在这里我的代码

/*jshint esnext: true */
function show(msg) {
  var _msg = msg;
  setTimeout(function() { console.log(_msg);}, 2000);
}

function show2(msg) {
  console.log(msg);
}

var stack = [];

// add some function to stack
stack.push(function() { show(1); });
stack.push(function() { show(2); });
stack.push(function() { show(3); });
stack.push(function() { show2(4); });
stack.push(function() { show(5); });

function* generator1() {
  for(var key of stack) {
    yield key();
  }
}
var gen = generator1();
gen.next();
gen.next();
gen.next();
gen.next();
gen.next();
Run Code Online (Sandbox Code Playgroud)

S M*_*han 4

这可以纯粹使用生成器来完成。下面是一种方法的示例,其中我们将 移至.next()超时本身,以确保它不会过早发生。此外,生成器现在从堆栈中返回函数而不是执行它,因为您无法.next()从生成器本身的执行中调用生成器。

值得注意的是,这可能不是我在“野外”执行此操作的方式;我会包括承诺。但你问是否可以只用发电机来完成 - 答案是“是”。

function show(msg) {
  var _msg = msg;
  setTimeout(function() { 
      console.log(_msg);
      execute();
  }, 2000);
}

function show2(msg) {
  console.log(msg);
  execute();
}

var stack = [];

function execute() {
  var fn = gen.next().value;
  if (fn) fn();
}

// add some function to stack
stack.push(function() { show(1); });
stack.push(function() { show(2); });
stack.push(function() { show(3); });
stack.push(function() { show2(4); });
stack.push(function() { show(5); });

function* generator1() {
  for(var key of stack) {
    yield key;
  }
}
var gen = generator1();
execute();
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/smmccrohan/k271gz7o/