javascript - 我可以在 JavaScript 中获取生成器的当前值吗?

标签 javascript generator yield

假设我想在点击时为我的按钮轮换类名。单击一次变为 button-green,单击两次 - button-yellow,三次 - button-red。然后它会重复,所以第四次点击会使其再次变为 button-green

我知道其他技术如何做到这一点,我不是在寻求实现建议。我编写这个示例是为了了解有关 JavaScript 中的生成器的一些知识。

这是我的生成器代码:

function* rotator(items) {
    while (true) {
        for (const item of items) {
            yield item;
        }
    }
}

const classRotator = rotator([
    'button-green',
    'button-yellow',
    'button-red',
]);

document.getElementById('my-button').addEventListener('click', event => {
    event.currentTarget.classList.add(classRotator.next().value);
});

它工作正常,除了它永远不会摆脱上一个类。最方便的方法是在获取下一个状态之前读取当前状态:

// .current is not a thing:
event.currentTarget.classList.remove(classRotator.current);

我当然可以把这个值自己留着用。同样,我可以自己清除在 rotator() 中使用的所有类。我什至可以让我的生成器函数 yield 包含先前值和当前值:

function* rotator(items) {
    let previous;

    while (true) {
        for (const item of items) {
            yield {
                item,
                previous
            };

            previous = item;
        }
    }
}

然后像这样使用它:

document.getElementById('my-button').addEventListener('click', event => {
    const {item: className, previous: previousClassName} = classRotator.next().value;

    event.currentTarget.classList.remove(previousClassName);
    event.currentTarget.classList.add(className);
});

但这不是重点 - 出于教育目的,我问这个问题:

我可以在 JavaScript 中读取生成器函数的当前值吗?如果不是,是否避免在不需要时使用内存(这个值可能非常大)?

最佳答案

Can I read the current value of generator function in JavaScript?

没有。

但是你可以easily implement this yourself如果你愿意的话。

If not, is it to avoid using memory when it's not needed?

也许吧。迭代器应该不依赖于它生成的最后一个值,以允许独立的垃圾收集并降低保留耗尽或尚未完成的生成器的成本。

但我认为设计中没有可用的 .current 字段的主要原因是从理论的 Angular 来看它没有意义:在迭代开始之前该字段有什么值(value),还是在迭代器耗尽之后?人们可能会选择 undefined,但干净的设计根本就没有该字段,只有在您实际执行迭代器时才会返回值。

关于javascript - 我可以在 JavaScript 中获取生成器的当前值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69867197/

相关文章:

javascript - 仅当使用 jQuery 的 html() 内部存在 <img/> 标记时获取元素内部文本

Javascript用函数返回替换局部变量

Python:写入文件时的内存使用情况(生成器与列表)

python - 尝试理解生成器的递归运行

基于 try/finally + yield 的 Python 析构函数?

Javascript 检查产量支持

javascript - 多个 ng-app 问题

javascript - 在这段 JavaScript 代码中,为什么有些函数可以访问内部变量,有些则不能?

python - 协程 vs 延续 vs 生成器

java - 如何去除使用后随机生成的字母?