【问题标题】:JavaScript Generators - How to skip yield when called using .next() ?JavaScript 生成器 - 使用 .next() 调用时如何跳过产量?
【发布时间】:2018-12-21 05:14:26
【问题描述】:

JavaScript 生成器允许您以程序方式生成操作。

是否可以在本地跳过/调用特定收益?

鉴于以下示例,如何实现?

我想产生值 1、3 和 5。

function *getVal() {
    yield 1;
    yield 2;
    yield 3;
    yield 4;
    yield 5;
} 


let x = getVal();

// I want to yield ONLY values 1 , 3 , & 5

// Here val will equal 1
let val = x.next();

// I now want to val to equal 3
val = << skip second yield and hit 3 >>

// Is it possible to skip a yield natively?
// ...

【问题讨论】:

  • 如果你想跳过一个收益,为什么不在将x.next()分配给val之前调用x.next()
  • 你不能跳过一个 yield,但你可以调用它并忽略结果。
  • @Ivan 谢谢,我知道你可以直接调用而不分配,但是跳过而不调用将要跳过的那个怎么样。
  • @Nicholas,这假设您知道生成器将产生的值,对吧?
  • 我认为要记住的是,生成器仍然像函数一样运行。 yield 会暂停该功能,直到它再次启动,但是您不能从外部跳过生成器的一部分,就像您可以进入并跳过任何其他功能的一部分一样。

标签: javascript ecmascript-6 generator yield next


【解决方案1】:

生成器遵循 javascript iterator protocol,因此除了调用 next() 之外,没有太多选项可以控制它们。

但是,由于您可以控制生成器的逻辑,因此您可以为对next() 的每个调用定义您想要的行为。如果您想跳过数字,只需设法将其传达给生成器即可。

比如这个生成器会生成连续的数字,但是会根据传入next()的数字跳过

function *getVal() {
    let n = 1;
    let skip = 0
    while (n <= 15){
        skip =  yield n
        n = n+1+ (skip || 0)
    }
} 


let x = getVal();

console.log(x.next().value);  // start with 1
console.log(x.next(1).value); // skip two
console.log(x.next().value)
console.log(x.next(2).value)  // skip 5 and 6
console.log(x.next(1).value); // skip 8
//etc.

【讨论】:

  • 所以你是说没有原生的 JavaScript 钩子来跳过产量?这是一个很酷的方法。
  • @Nicholas 不是我所知道的——迭代器协议非常简单,您基本上可以使用 next()
  • 谢谢你,马克,如果你可以在你的答案中包括没有本地方法可以跳过产量,我会倾向于接受这个答案作为一种解决方法。
  • 请注意,第一次调用 next 不能跳过任何内容。
【解决方案2】:

您可以随时调用下一个值而不分配它,然后再次调用.next 并分配它:

function *getVal() {
    yield 1;
    yield 2;
    yield 3;
    yield 4;
    yield 5;
} 


let x = getVal();

let val = x.next().value;   // 1
console.log(val);           

x.next();
val = x.next().value;       // 3
console.log(val);

x.next();
val = x.next().value;       // 5
console.log(val);

这样你忽略一些产生的值。

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 2014-06-13
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2017-02-05
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多