JavaScript Generators-使用.next()调用时如何跳过产量?

时间:2018-07-12 21:24:36

标签: javascript ecmascript-6 generator yield next

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?
// ...

2 个答案:

答案 0 :(得分:2)

生成器遵循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.

答案 1 :(得分:0)

您始终可以在不分配下一个值的情况下调用它,然后再次调用.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);

通过这种方式,您忽略一些产生的值。