如何迭代生成器函数的结果
How to iterate over the results of a generator function
有没有更好的方法来迭代生成器的结果,我的for循环很难看:
for(let job = readyJob.next(); !job.done; job = readyJob.next()){ }
在上下文中,有一个生成器函数可以确定是否存在由1..*个作业组成的一批作业(生成器也可能在该批作业中不返回任何作业)。有一个连续的循环,它实例化生成器,并在批处理上迭代执行作业(日志记录)。
对于这个迭代问题,有没有一个更优雅的解决方案。我的意思是,这看起来像Java/C#中的传统迭代器,还不错。像"each"这样的东西会超级可读。。。不管怎样,这是我的希望。
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()
};
}
}
然后
while(true){
let readyJob = getReadyJob()
for(let job = readyJob.next(); !job.done; job = readyJob.next()){
console.log(JSON.stringify(job.value)) ;
}
}
是的,如果您的环境已经支持for...of
:
for (var job of readyJob) {
// ...
}
如果没有,你已经见过几次了:
var next;
while (!(next = readyJob.next()).done) {
var job = next.value;
// ...
}
for ... of
是一个优雅的解决方案,但没有得到全面支持,然而while (!(next = cursor.next()).done) {
是一个非常神秘的解决方案。人们可能会问自己,为什么(var x = someFunctionCall())
被评估为true
另一个将回答CCD_ 6。
出于这个原因,为了给答案另一种形状,也可以使用递归函数来完成。
function loopThose(items) {
const item = items.next();
// doStuff(item);
if (!item.done) {
loopThose(items);
}
}
真正的好处是当异步、try-catch和自定义继续条件发挥作用时:
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())
}
}
相关文章:
- JScript 错误: 无法分配给函数结果
- 显示基于javascript函数结果的HTML代码
- 访问来自另一个函数的函数结果
- 将函数结果传递给Javascript中的另一个函数变量
- NaN作为函数结果而不是必需的整数出现问题
- 更改javascript更改函数结果的颜色
- 从函数结果中检测三角函数
- 根据函数结果使用 JavaScript 更改图像
- 如何返回函数结果并将它们设置为标记的内部 HTML
- JavaScript 如何将函数结果与数组中的值一起传递到同一个函数中
- 用
标记包装 JQuery 函数结果
- 节点函数结果未定义
- 使用Cheerio和Response for Node web scraper,将响应函数结果传递给视图
- 在所有项目javascript中显示函数结果
- 平板电脑友好的悬停工具提示,显示基于javascript函数结果的动态文本
- 在机器时间更改后立即更新Date()函数结果
- 屈服函数结果
- 如何在JavaScript中处理异步函数结果
- 声明和定义全局变量作为函数结果有时有效
- Jquery&函数结果,作为属性名称