【问题标题】:How to use generator.next() inside while loop?如何在 while 循环中使用 generator.next()?
【发布时间】:2018-02-06 05:48:52
【问题描述】:

我有发电机

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);
}

我有 while 无限循环,语法如下:

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

我想在其中使用generator.next() 函数。但是生成器不工作。

我尝试了for 循环,它工作正常。

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

【问题讨论】:

  • 什么是generator
  • 您希望如何摆脱无限循环?当然,无论调用什么方法,无限循环都不起作用。
  • 生成器函数的yield 不会自动等待您的异步函数解析。不要将懒惰与异步混为一谈。
  • 好的,现在回到 Bergi 的问题:你到底想用这个来完成什么?按顺序获取每个页面?
  • @Remzes 为什么你认为你需要一个生成器呢?一个异步无限循环就足够了。

标签: javascript async-await generator ecmascript-2017


【解决方案1】:

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

绝对没有理由在这里使用生成器。明码

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

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

那么,它有什么问题呢?

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

我想检索信息并将其放入 console.log。我想用生成器、async/await 和无限 while 循环来异步。

省略生成器 - 无论如何它都不是异步的。您只能使用 async/await 和无限循环来做到这一点:

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

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

【讨论】:

  • 非常感谢您的解释!
  • 你能给我解释一下最后一个函数吗,或者来源,我可以在哪里读到它
  • @Remzes 这只是将IIFE 变成async,允许我们在其主体中使用await 语法。例如,请参阅ES8 Immediately invoked async function expression
猜你喜欢
  • 2014-11-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多