2015-04-02 23 views
2

產量返回值的。如果我在一臺發電機,除了提供給yield關鍵字的權利表達提供一個值next法,怎麼會是yield的返回值解決了嗎?分辨率在JavaScript發電機

function* go() { 
    console.log(yield 'a'); 
    console.log(yield 'b'); 
} 

var g = go(); 
g.next(); 
g.next('one'); 
g.next('two'); 

輸出:

one 
two 
Object {value: undefined, done: true} 

在輸出的光,所以供給到用於在由表達式返回到的yield右邊的值的下一個方法的值。

編輯:代碼更新,以更好地反映我的問題。

+0

你是什麼意思的「解決」? – Bergi 2015-04-02 21:40:51

+0

請注意,您可以將您的示例簡化爲'function * go(){console.log(yield'a'); }' – Bergi 2015-04-02 21:42:46

+0

'yield'可能返回的值之間有衝突 - 無論是作爲參數傳遞給next的值,還是表達式返回的yield值關鍵字右邊的值。有哪些規則可以確定哪一個是由收益「返還」的。 – Ben 2015-04-02 21:44:11

回答

2

根據輸出,它是提供給下一個方法的值,該值用於表達式返回到yield右側的值。

提供給next方法的值未被「用於」yield右側的值。提供給next的值是yield表達式最終評估的值。總是。 yield右邊的值是提供給發電機的消費者的值。

它是發生器和消耗發生器的代碼之間的雙向通信。

function* go() { 
    console.log(yield 'a'); // 'one' 
    console.log(yield 'b'); // 'two' 
} 

var g = go(); 
console.log(g.next());  // { value: 'a', done: false }  
console.log(g.next('one')); // { value: 'b', done: false } 
console.log(g.next('two')); // { value: undefined, done: true } 
+0

*** + 1 ***用於指出**它是發生器和消耗發電機**的代碼之間的雙向通信。我猜[解釋](https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Operators/yield)由MDN提供的關於'rv'的信息有點讓人誤解,因爲「表達式的值」可能指的是yield_右邊的表達式。 – 2015-10-09 15:32:55

2

有兩種方法可以解釋「收益率的回報值」。

您可能意思是表達式yield 'a'的值。您可以從輸出中看到值爲one

或者您可能意味着傳遞到yield的值,該值從生成器的next方法有效「返回」。你的代碼片段並沒有真正揭示這一點。嘗試:

console.log('next1', g.next()); 
console.log('next2', g.next('one')); 
console.log('next3', g.next('two')); 

這樣,你可以看到的值出來的發電機,這應該是這個樣子:

"next1", {value: "a", done: false} 
"next2", {value: "b", done: false} 
"next3", {value: undefined, done: true} 

你能做的就是在最後添加一個普通return值一件事你的發電機功能,這將是valuenext3