2016-12-18 56 views
2

有沒有辦法在生成器的finally塊中訪問迭代器的最終值?最後訪問生成器結果塊

function*generator() { 
 
try { 
 
    let value1 = yield(1) 
 
    let value2 = yield(2) 
 
} finally { 
 
    console.log("Ending, how to access the result? (4)") 
 
} } 
 

 
var iterator = generator() 
 
var result1 = iterator.next(1) 
 
var result2 = iterator.return(4)

+0

難道你不能只聲明'try'外的值嗎? – Carcigenicate

+0

不,該值由iterator.return(value) –

回答

0

是否有訪問迭代器的最終值在最後 塊在發電機的方法嗎?

是的,你可以簡單地return終值:

function* generator() { 
try { 
    var value1 = yield(1) // cannot use let here 
    var value2 = yield(2) // cannot use let here 
    console.log('never gets here'); 
} finally { 
    return [value1, value2]; 
} 
} 

var iterator = generator(), 
    result0 = iterator.next(), // starts the generator 
    result1 = iterator.next("a"), // "a" gets assigned to value1 
    result2 = iterator.return("b"); // "b" does not get assigned to value2 

console.log(result0); // { value: 1, done: false } 
console.log(result1); // { value: 2, done: false } 
console.log(result2); // { value: [ 'a', undefined ], done: true } 

.return("b")可能導致result2成爲{ value: 'b', done: true }。但是在上面的代碼return [value1, value2]中將覆蓋"b"。這使您能夠訪問finally區塊中的最終結果。

無論是否覆蓋"b",它都不會傳遞到發生器本身進行處理,因此只能作爲result2.value(如果不覆蓋)訪問。

0

不,不可以在生成器中訪問傳遞給.return()的參數。它與try塊內的return語句相同 - 只能覆蓋finally子句中的返回值,但不能讀取它。