Javascript 如何迭代生成函数的结果

Javascript 如何迭代生成函数的结果,javascript,node.js,generator,ecmascript-6,Javascript,Node.js,Generator,Ecmascript 6,有没有更好的方法来迭代生成器的结果,我的for循环很难看: for(let job = readyJob.next(); !job.done; job = readyJob.next()){ } 在上下文中,有一个生成器函数可以确定是否存在由1..*个作业组成的工作批(生成器也可能在该批中不返回任何作业)。有一个连续循环,它实例化生成器,并在批处理上迭代作业(日志记录) 这个迭代问题有没有更优雅的解决方案。我的意思是,这看起来像是来自Java/C的传统迭代器,这还不错。像“每个”这样的东西会

有没有更好的方法来迭代生成器的结果,我的for循环很难看:

for(let job = readyJob.next(); !job.done; job = readyJob.next()){ } 
在上下文中,有一个生成器函数可以确定是否存在由1..*个作业组成的工作批(生成器也可能在该批中不返回任何作业)。有一个连续循环,它实例化生成器,并在批处理上迭代作业(日志记录)

这个迭代问题有没有更优雅的解决方案。我的意思是,这看起来像是来自Java/C的传统迭代器,这还不错。像“每个”这样的东西会非常可读。。。无论如何,这是我的希望

 let getReadyJob = function *(instance){
    let numJobs = 7 ; // getRandomInt(0, 10) ;
    for(let i = 0; i < numJobs; i++) {
        yield {
            jobId: '' + instance + '::' + i,
            jobReadyOn: (new Date()).valueOf()
        };
    }
}

是,如果您的环境已经支持:

如果没有,请看几遍:

var next;
while (!(next = readyJob.next()).done) {
   var job = next.value;
   // ...
}

用于。。。of
是一个优雅的解决方案,但没有得到全面支持,然而(!(next=cursor.next()).done){是一个非常神秘的问题,人们可能会问自己,为什么
(var x=someFunctionCall())
的计算结果是
真的
另一个回答是
欢迎使用javascript

出于这个原因,为了给答案另一个形状,也可以使用递归函数来完成

function loopThose(items) {
    const item = items.next();

    // doStuff(item);

    if (!item.done) {
        loopThose(items);
    }
}
真正的好处是当异步、尝试捕获和自定义继续条件发挥作用时:

async function printKeys(items) {
    try {
       const item = await items.next();
       // doStuff(item);
       if (isConditionFulfil(item)) {
          await this.printKeys(items);
       }
    } catch (e){

    }
}
如果生成器函数产生可能失败的承诺:

function * list(){
  for (var i = 0; i<10; i++){
     yield fetch(buildResourceUrl(i)).then(res => res.json())
  }
}
函数*list(){
for(var i=0;i res.json())
}
}

这个“for of”正是我想要的(双关语)-谢谢。我会将“while loop”选项与我提到的“for loop”选项混为一谈,就像C++/Java/C一样-当然它可以工作,但在这一行中有很多内容,而且它不是超级可读的…嗯,
while
是非常惯用的。但是,
for..of
在可读性方面胜过了它,是生成器的完美组合。)使用索引进行迭代怎么样?@Weilory:保留你自己的计数器。
async function printKeys(items) {
    try {
       const item = await items.next();
       // doStuff(item);
       if (isConditionFulfil(item)) {
          await this.printKeys(items);
       }
    } catch (e){

    }
}
function * list(){
  for (var i = 0; i<10; i++){
     yield fetch(buildResourceUrl(i)).then(res => res.json())
  }
}