在下面的代码中:

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/

10-11 04:12