2016-12-30 24 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

真的很喜歡第二個,今天學到了一些新東西:) –