我正在尝试使用生成器停止setTimeOut上的执行流。我究竟做错了什么?每1500毫秒我都无法退出console.log。我在节点上是新手,如果我做的很愚蠢,请不要以心灵感应杀死我



['1', '2', '3'].forEach(function* iteration(index) {
  // Some logic here
  yield setTimeout(() => console.log('sick of this!'), 1500)
  iteration.next(index)
})

最佳答案

可悲的是你做不到。 Array.prototype.forEach是更高级别的函数,它仅调用给定的回调,但不会,并且不能使用生成器。我的意思是您可以提供一个生成器,因为生成器只是正常功能,但是它们不会运行,并且您不能产生值。

第二件事是,您将只产生timeoutId-s,我很确定您想等待1500 ms。

因此,您将必须摆脱forEach并使用for..of,并且必须编写一个延迟函数,使用async / await看起来像:

function delay(time, value) {
  return new Promise(resolve => { setTimeout(() => { resolve(value); }, time); });
}

async function main() {
  for (var item of ['1', '2', '3']) {
    await delay(1000);
    console.log(item);
  }
}

main().then(null, e => console.error(e));


You can transpile it with babel.

如果您希望使用常规的节点回调,那会比较困难,虽然不太好,但是绝对有可能。如果允许您选择,我建议您使用异步/等待方式。

10-08 11:44