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)
这可以纯粹使用生成器来完成。下面是一种方法的示例,其中我们将 移至.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/
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |