【问题标题】:Can Asynchronous Generators be called using a pass through / helper function in Node.js?可以在 Node.js 中使用 pass through / helper 函数调用异步生成器吗?
【发布时间】:2018-07-26 18:05:27
【问题描述】:

我能做什么

我发现异步生成器模式对于 JavaScript 来说是相当新的,并且仅在 Node.js 版本 10 中可用。所以在我完成所有这些之后,我现在可以使用以下函数在 Web 中生成多个相似的元素使用 Selenium 的页面,它的许多功能使用 async/await:

formElements = async function*(containerCss, childCss, defaultCount) {
    let countCSS = containerCss + " " + childCss;

    let numElements = await countCss(countCSS) || defaultCount;

    for (let cIndex = 1; cIndex <= numElements; cIndex++) {
        let elementCss = containerCss + ":nth-child(" + cIndex + ") " + childCss;

        yield await elmCSS(elementCss);
    }
}

使用此调用,此函数可以作为异步生成器正常工作:

for await (const button of formElements("button-container-css", "button-css", 6))
{
    await clickOn(button);

    //other async stuff...
}

我想不通

但我想做的是将这些特定参数从主函数中取出,并有一个辅助函数 (formButtons()) 来提供它们,我认为它应该看起来像这样 (?):

formButtons = async function*() {
    yield await formElements("button-container-css", "button-css", 6);
}

所以我的主要功能可以是一个小清洁工:

for await (const button of formButtons())
{
    await clickOn(button);
    //other async stuff...
}

但是一旦碰到formButtons() 中的yield,它实际上会跳过所有内容,返回 null 并导致错误。我认为错误一定是在我的 formButtons() 函数中,或者它是不使用 Node 的稳定版本的一些不幸的工件,但我希望这是我可以修复的东西

是否有错误或解决方法?

【问题讨论】:

  • 我对生成器没有经验,但这是您需要yield*的情况吗?
  • @Pointy 花了我一点时间来弄清楚你的意思并尝试一下,但是是的 - 将其添加为答案(可能带有链接:-P),我会接受它: -)
  • 已添加答案。希望我得到的解决方案与您最终得到的解决方案相同:)

标签: javascript node.js selenium async-await yield-return


【解决方案1】:

需要注意的是,我在玩具应用程序中只使用过几次生成器,您遇到的情况基本上是从一个生成器到另一个生成器的委托。由于您要做的是将控制完全“传递”给子生成器,因此您可以使用yield* 而不是yield。它的基本意思是,“产生你能从这个生成器中得到的一切”。所以:

formButtons = async function*() {
    yield* await formElements("button-container-css", "button-css", 6);
}

【讨论】:

  • 有时变化如此之小,嗯?谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2019-01-20
  • 2021-12-08
  • 2019-08-18
  • 2018-01-04
相关资源
最近更新 更多