Javascript ES6 生成器异步

标签 javascript generator ecmascript-6

我需要异步运行生成器(我需要在控制台 1、2、3、4、5 中得到结果,因为现在我有 4、1、2、3、5)有人可以帮助我吗?我需要运行任务并等待上一个任务完成后再运行下一个任务。我需要使用(如果可能:仅)生成器(或生成器 + promise?)

这是我的代码

/*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();

最佳答案

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

这里值得注意的是,这可能不是我“在野外”执行此操作的方式;我会包括 promise 。但是您问是否可以只用一个生成器来完成 - 答案是"is"。

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();

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

关于Javascript ES6 生成器异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30471189/

相关文章:

python - 如何生成二维 numpy 数组?

javascript - ES6 解构具有相同属性名称的两个对象

javascript - 如何检查 JSON 响应的大小?

javascript - jQuery 创建一个元素并获取高度

javascript - 使用 jquery 将 json 对象数组合并为单个对象

python - 多处理 - 读取大输入数据 - 程序挂起

python - 生成器和序列之间的 Keras 区别

javascript - 我的 .html() 语法有什么问题?

javascript - 无法解构 null 的属性

javascript - 访问node.js中另一个类的构造函数值