我需要异步运行生成器(我需要在控制台 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();
关于Javascript ES6 生成器异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30471189/