Javascript 控制内部的执行流。每个循环节点

Javascript 控制内部的执行流。每个循环节点,javascript,node.js,ecmascript-6,generator,Javascript,Node.js,Ecmascript 6,Generator,我正在尝试使用生成器停止setTimeOut上的执行流。我做错了什么?我无法获得控制台。每1500毫秒注销一次。我是新加入节点的,如果我做了一件非常愚蠢的事情,请不要用心灵感应杀死我 ['1','2','3'].forEach(函数*迭代(索引){ //这里有些逻辑 yield setTimeout(()=>console.log('sick of this!'),1500) 迭代。下一步(索引) })可悲的是你不能Array.prototype.forEach是一个更高级别的函数,它只调用给

我正在尝试使用生成器停止setTimeOut上的执行流。我做错了什么?我无法获得控制台。每1500毫秒注销一次。我是新加入节点的,如果我做了一件非常愚蠢的事情,请不要用心灵感应杀死我

['1','2','3'].forEach(函数*迭代(索引){
//这里有些逻辑
yield setTimeout(()=>console.log('sick of this!'),1500)
迭代。下一步(索引)

})
可悲的是你不能
Array.prototype.forEach
是一个更高级别的函数,它只调用给定的回调函数,但不会也不能调用生成器。我的意思是你可以给一个生成器,因为生成器只是普通函数,但它们不会运行,你也不能产生值

第二件事是,您只需生成timeoutId-s,我很确定您想要等待1500毫秒

因此,您必须摆脱forEach,改用for..代替,并且必须使用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));


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

也许您可以这样做

['1','2','3'].forEach(e=>{function*迭代(索引){
//这里有些逻辑
var val=yield setTimeout(=>it.next(index),0);//使异步
setTimeout(=>console.log('sick of this..!'+val),1500*val);
}
var it=迭代(e);
it.next();//启动引擎

});
最重要的是,
setTimeout
不会返回任何您可以
yield
甚至等待的内容-使用承诺。其次,生成器不是异步的,如果您希望它是异步的,那么您必须使用一个特殊的运行程序(如
co
库)。最后,
iteration
没有
next
方法不管您在生成器方面的问题,这听起来像是