2017-03-04 74 views
0

在下面的代碼(從Javascript併發截取)困惑,應該有iterable = genMap(iterable, iteratee)循環換的經過三次發生器對象。但是,yield* iterable是一個單一的參考。它如何yield三組數值從genMap?謝謝。由發電機

function* genMap(iterable, iteratee) { 
    for (let item of iterable) { 
     console.log('item', item) 
     yield iteratee(item); 
    } 
} 

function composeGenMap(...iteratees) { 

    return function* (iterable) { 
     for (let iteratee of iteratees) { 
      iterable = genMap(iterable, iteratee); 
     } 

     yield* iterable; 
    } 
} 

// Our iterable data source. 
var array = [ 1, 2, 3 ]; 

var composed = composeGenMap(
    x => x + 1, 
    x => x * x, 
    x => x - 2 
); 

for (let item of composed(array)) { 
    console.log('composed', item) 
} 
// → 
// composed 2 
// composed 7 
// composed 14 
+0

'產量*'推遲執行到另一發電機。 – gyre

回答

1

yield*將執行延遲到另一個生成器,或者如果您願意,也可以迭代。

這意味着它可以在技術上yield多個值(三級你的情況)。

the Mozilla Developer Network article on yield*

產量*表達式用來委託給另一發電機或迭代的對象。

+0

我看到......然而,只有似乎可以解釋從傳遞給組成(陣列)的陣列中的單個指標。例如,陣列的第一個值是2和它被變換三次:// 1 => 1 + 1 = 2,2 => 2 * 2,4 => 4 - 2 = 2。我仍然不明白爲什麼單個「可迭代」不會突變....? – bresson

+0

這個例子可能澄清有關執行的順序你的東西:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield%2A#Delegating_to_another_generator – gyre

+0

@bresson難道這個例子在幫助所有? – gyre