gpt4 book ai didi

javascript - 为什么生成器的 .next 需要一个 setTimeout?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:58:49 26 4
gpt4 key购买 nike

我正在试验 ES6 的生成器函数和 yield 语句,Example .

function run(generator) {
var itr = generator(resume);

function resume(callbackValue) {
itr.next(callbackValue);
}
itr.next();
}

function* main(resume) {
var result1 = yield add(1, resume);
var data1 = result1;
console.log("add 1 = ", data1)
var data2 = yield add(1, resume);
console.log("add 1 = ", data2);
var data3 = yield add(data1, resume);
console.log("add data1 =", data3);
console.log("total is ", data1 + data2 + data3);
}

function add(num, resume) {
setTimeout(function() {
resume(num + 1);
}, 0);
}

run(main);

我计划使用 yield 作为异步 REST 调用的流程控制,请求一旦有响应就会调用 next,但现在我只使用一个简单的添加函数。它按计划工作,这很令人兴奋,但简历只能在 setTimeout 中使用,我不确定为什么。如果它只有:

function add (num, resume) {
resume(num + 1);
}

解释器给我“Generator is already running”。

超时时间不需要实际等待,我也尝试了自调用功能,但没有帮助。为什么 itr.next() 需要超时?

最佳答案

正如其他评论者所说,您正试图在 yield 表达式仍在解析时调用 resume。异步调用 itr.next 将允许 yield 表达式完成,然后在完成时立即调用 itr.next。要让它按照你想要的方式工作,只需更改 run:

function run(generator) {
var itr = generator(resume);

function resume(callbackValue) {
setTimeout(function(){
itr.next(callbackValue);
}, 0);
}
itr.next();
}

这是一个非常有趣的想法,它可以 actually be useful .

关于javascript - 为什么生成器的 .next 需要一个 setTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32909789/

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