2016-12-30 23 views
2

今天我想知道什么是提供在打字稿一个周期,通过阵列,作为最快捷的方法:如何实现与发电机功能的循环,通过阵列

['one', 'two', 'three'] 

下一个值在threeone后,我认为这是一个很好的候选发电机功能。但它似乎并不适合我。下面的代码有什么问题?

function* stepGen(){ 
    const steps = ['one', 'two', 'three']; 

    let index = 0; 

    if(index < steps.length - 1){ 
    index++; 
    } else { 
    index = 0; 
    } 
    yield steps[index]; 
} 

let gen = stepGen(); 
console.log(gen.next().value); 
console.log(gen.next().value); 
console.log(gen.next().value); // should be 'three' 
console.log(gen.next().value); // should be 'one' 
console.log(gen.next().value); 
+0

你需要在你的发生器代码中有一个循环。 – trincot

回答

5

您需要在您的生成器代码回路,否则只有一个yield发生:

function* stepGen(steps){ 
 
    let index = 0; 
 
    while (true) { 
 
    yield steps[index]; 
 
    index = (index+1)%steps.length; 
 
    } 
 
} 
 

 
let gen = stepGen(['one', 'two', 'three']); // pass array to make it more reusable 
 
console.log(gen.next().value); 
 
console.log(gen.next().value); 
 
console.log(gen.next().value); 
 
console.log(gen.next().value); 
 
console.log(gen.next().value);

另外,您也可以使用yield*这将产生从一个可迭代值,一个接一个:

function* stepGen(steps){ 
 
    while (true) yield* steps; 
 
} 
 

 
let gen = stepGen(['one', 'two', 'three']); 
 
console.log(gen.next().value); 
 
console.log(gen.next().value); 
 
console.log(gen.next().value); 
 
console.log(gen.next().value); 
 
console.log(gen.next().value);

+0

此外,如果您将该阵列作为参数,则它是OP –

+0

@BalázsÉdes的立即可用块,谢谢,我将这一改进想法融入其中。 – trincot

+0

真的很喜欢第二个,今天学到了一些新东西:) –