我正在尝试使用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已经在运行'。
在超时时间内不需要实际等待,我也尝试了自我调用功能,但这并没有帮助。为什么itr.next()
需要超时?
答案 0 :(得分:3)
正如其他评论者所说,当resume
表达式仍在解析时,您正试图致电yield
。异步调用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。