2017-03-04 75 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