我正在尝试使用生成器停止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.
如果您希望使用常规的节点回调,那会比较困难,虽然不太好,但是绝对有可能。如果允许您选择,我建议您使用异步/等待方式。