2017-04-17 53 views
0

我想寫一個簡單的發電機獲得通過調用nextJavaScript,爲什麼發生器失敗?

> var gg = next_id(); 
> function* next_id() { 

    var current_id = 1; 
    yield current_id; 
    current_id ++; 
    return current_id; 
} 

> gg.next() 
Object {value: 1, done: false} 
> gg.next() 
Object {value: 2, done: true} 
> gg.next() 
Object {value: undefined, done: true} 
> gg.next() 
Object {value: undefined, done: true} 

爲什麼這臺發電機只是產生2的值增加的價值?

我改變了代碼

function* next_id() { 

    var current_id = 1; 
    while (1) { 
     yield current_id; 
     current_id ++; 
    } 
    return current_id; 
} 

它的工作原理,這真的讓我感到困惑。

+0

多數民衆贊成在發電機工作正確 –

回答

2

因爲你只能叫yield一次。看起來這是你正在嘗試做的:

function* next_id() { 
 
    var index = 0; 
 
    while(true) 
 
    yield index++; 
 
} 
 

 
var gen = next_id(); 
 

 
console.log(gen.next()); 
 
console.log(gen.next()); 
 
console.log(gen.next());

參考發電機here的文檔。

0

您需要一個循環並丟棄return語句,該語句結束該函數,而yield只是停止執行生成器。

在您的編輯中,return聲明是永遠不會到達,因爲循環會永久運行。

function* next_id() { 
 
    var current_id = 1; 
 
    while (true) { 
 
     yield current_id; 
 
     current_id++; 
 
    } 
 
} 
 

 
var gg = next_id(); 
 

 
console.log(gg.next()); // { value: 1, done: false } 
 
console.log(gg.next()); // { value: 2, done: false } 
 
console.log(gg.next()); // { value: 3, done: false } 
 
console.log(gg.next()); // { value: 4, done: false }
.as-console-wrapper { max-height: 100% !important; top: 0; }