gpt4 book ai didi

Javascript ES6 生成器异步

转载 作者:数据小太阳 更新时间:2023-10-29 06:06:08 25 4
gpt4 key购买 nike

我需要异步运行生成器(我需要在控制台 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com