在下面的代码中:
function so() {
console.log('inside the timer')
}
function* sogen() {
const callback = yield;
setTimeout(callback, 2000);
return 1;
}
function() {
var gen = sogen();
gen.next(so), gen.next(so);
}()
为什么我从来没有达到
so
函数? 最佳答案
tl; dr,您需要在IIFE上加上括号或完全不使用IIFE。
您可以使用生成器,并且一旦添加了括号,一切都会正常进行。
请注意,您实际上并不需要IIFE来运行代码,但是下面的答案解释了为什么您的内容无法正常工作。
函数声明与函数表达式
您遇到的主要问题是以下代码:
function() {
var gen = sogen();
gen.next(so);
gen.next(so);
}()
这将产生类似于以下内容的错误:
这里的问题是您正在尝试将function declaration用作function expression。
从MDN(重点是我的):
这意味着为了立即执行功能,您需要使用功能表达式而不是语句。
编写函数表达式的一种常用方法是将函数包装在括号中:
function a() { return 'a'; } // Function declaration
(function b() { return 'b'; }) // Function expression
要将其转换为IIFE,可以在末尾添加
()
调用括号:(function c() { return 'c'; })() // IIFE
它会立即调用该函数。
请注意,我更喜欢将调用括号放在包装括号内,但这只是一种样式选择,并且以相同的方式工作:
(function c() { return 'c'; }()) // IIFE
这是答案中的代码,以及包装IIFE的括号:
function so() {
console.log('inside the timer');
}
function* sogen() {
const callback = yield;
setTimeout(callback, 2000);
return 1;
}
(function() {
const gen = sogen();
gen.next(so);
gen.next(so);
}())
或者,只需删除您的IIFE:
const gen = sogen();
gen.next(so);
gen.next(so);
或者,如果您需要函数声明,请在下一行调用该函数:
function run() {
const gen = sogen();
gen.next(so);
gen.next(so);
}
run();
关于javascript - 当通过yield传递回调时,为什么 `setTimeout`不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52844696/