【发布时间】:2019-09-28 02:18:13
【问题描述】:
我对生成器函数比较陌生,想知道是否有办法从生成器函数中获取先前的值。我知道我可以使用.next() 继续下一个yield,但我想知道是否可以执行.prev() 之类的操作,这实际上会后退一步。
我希望.prev() 能工作,但不幸的是它没有:
const array = ['a', 'b', 'c'];
function* f(array) {
let i = 0;
while(true) {
yield array[i];
i = (i+1) % array.length;
}
}
const seq = f(array);
console.log(seq.next().value); // a
console.log(seq.next().value); // b
console.log(seq.next().value); // c
console.log(seq.next().value); // a
// console.log(seq.prev().value); // c <-- expect 'c'
正如我所提到的,我对生成器缺乏经验,如果有更好的数据结构/方法来逐步获取值(上一个和下一个),我愿意听取这些建议
【问题讨论】:
-
在Generator 的文档中,您在哪里看到“prev()”(或类似的东西)?您可以轻松编写您的 OWN JS 原型对象,该对象允许您进行任何您想要的操作。但是这个特殊的 JS 原型恰好是“仅向前的”。
-
可能只有我,但这有什么用例?
-
@paulsm4 嗨,是的,我知道
prev()不是文档的一部分,我只是用来帮助解释我所追求的想法/概念 -
@Shnick 使用合适的数据结构,而不是使用不是为这种情况设计的生成器,您可以简单地使用循环链表并保存最后使用值的引用,然后朝任何方向前进想要,或者正如
certainperformace所回答的那样,使用数组和模数技术,很高兴看到您正在尝试以多种方式解决一个问题,我很欣赏这一点,即使我一直都这样做,但生成器不是这种情况下 IMO 的好选择 -
@CodeManiac 是的,我同意生成器不适合这种情况,因为我知道它们的局限性和优势
标签: javascript function ecmascript-6