Javascript 如何迭代生成函数的结果
有没有更好的方法来迭代生成器的结果,我的for循环很难看: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(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())
}
}