如何在循环中使用generator.next()?

时间:2017-08-28 21:48:02

标签: javascript async-await generator ecmascript-2017

我有发电机

function* pendingPage() {
    let value = 1;
    while (true)
        yield getPage(value++);
}

我有getPage()功能

async function getPage(value) {
    const page = await service.getValidations(value);
    (page.data.customers.length === 0) ? service.isCustomersFinished = false : console.log(page.data.customers);
}

我使用以下语法进行无限循环:

let generator = pendingPage()
while(true){
   generator.next();
}

我想在其中使用generator.next()函数。但是发电机不起作用。

我尝试使用for循环,它运行正常。

那么,它有什么问题以及如何在无限循环中使用generator.next()

1 个答案:

答案 0 :(得分:2)

  

我想在其中使用generator.next()函数。

这里绝对没有理由使用发电机。普通代码

{
    let value = 1;
    while (true) {
        getPage(value++);
    }
}

与调用pendingPage生成器并永远迭代它完全相同。

  

那么,它有什么问题?

这是一个无限循环。这就是问题所在。它将永远调用getPage,并阻止整个过程执行任何其他操作。如果这里的所有内容都是同步的,那么你想要的是什么,但请注意getPage和specfically service.getValidations是异步的。阻止所有内容包括阻止异步回调的发生,这就是您没有获取任何日志的原因。使用有界for循环,迭代在某个时刻结束,并且回调有机会被调用。

  

我想检索信息并将其放到console.log中。我想用生成器,async / await和无限循环来实现异步。

省略发电机 - 它不是异步的。您只能使用async / await和无限循环来执行此操作:

(async function() {
    let value = 1;
    while (true) {
        await getPage(value++);
    }
}());

这仍然是一个无限循环,但它会在每个await暂停,以允许其他事情发生。