Javascript 被发电机搞糊涂了

Javascript 被发电机搞糊涂了,javascript,ecmascript-6,generator,Javascript,Ecmascript 6,Generator,在下面的代码中(取自Javascript并发),在循环的iterable=genMap(iterable,iteratee)之后应该有三个生成器对象。但是,yield*iterable是一个单独的参考。它如何从genMap中产生三组值?多谢各位 function* genMap(iterable, iteratee) { for (let item of iterable) { console.log('item', item) yield iterate

在下面的代码中(取自Javascript并发),在循环的
iterable=genMap(iterable,iteratee)
之后应该有三个生成器对象。但是,
yield*iterable
是一个单独的参考。它如何从
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

yield*
将执行延迟到另一个生成器,或者如果您愿意,也可以延迟到一个iterable

这意味着从技术上讲,它可以产生多个值(在您的情况下是三个)

发件人:

yield*表达式用于委托给另一个生成器或iterable对象


yield*
将执行延迟到另一个生成器。我明白了。。。然而,这似乎只能解释从数组传递到组合(数组)的单个索引。例如,数组的第一个值是2,它被转换三次://1=>1+1=2,2=>2*2,4=>4-2=2。我仍然不明白为什么单一的“iterable”没有变异…?这个例子可能会为你澄清关于执行顺序的事情:@bresson这个例子有帮助吗?是的。谢谢你,格瑞。