2017-03-04 6 views
0

In dem folgenden Code (aus Javascript Concurrency) sollte nach der iterable = genMap(iterable, iteratee) for-of-Schleife drei Generatorobjekte sein. Jedoch ist yield* iterable eine einzige Referenz. Wie funktioniert es yield drei Sätze von Werten von genMap? Vielen Dank.Durch den Generator verwirrt

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

'yield *' verschiebt die Ausführung zu einem anderen Generator. – gyre

Antwort

1

yield* aufschiebt Ausführung an einen anderen Generator, oder vielleicht ein iterable, wenn Sie dies wünschen.

Das bedeutet es kann technisch yield mehr als einen Wert (drei in Ihrem Fall).

Von the Mozilla Developer Network article on yield*:

Die Ausbeute * Ausdruck wird verwendet, um einen anderen Generator oder iterable Objekt zu übertragen.

+0

Ich sehe ... aber das scheint nur einen einzelnen Index aus dem Array zu erklären, das an composed (array) übergeben wird. Zum Beispiel ist der erste Wert von Array 2 und es wird dreimal transformiert: // 1 => 1 + 1 = 2, 2 => 2 * 2, 4 => 4 - 2 = 2. Ich verstehe immer noch nicht Warum ist die einzelne "iterable" nicht mutiert ....? – bresson

+0

Dieses Beispiel könnte Ihnen die Reihenfolge der Ausführung verdeutlichen: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield%2A#Delegating_to_another_generator – gyre

+0

@bresson Hat dieses Beispiel geholfen? alle? – gyre

Verwandte Themen