生成函数中的委托收益率(收益率星,收益率*)

Ran*_*lue 30 javascript ecmascript-6

ECMAScript 6应该带来生成器函数和迭代器.生成器函数(具有function*语法)返回迭代器.迭代器有一个next方法,当重复调用时,它执行生成器函数的主体,在每个yield操作员处重复暂停和恢复执行.

生成器上ECMAScript 6 wiki还引入了"委托产量" yield*运算符,如下所示:

yield*运营商委托给另一发电机.这为组合生成器提供了方便的机制.

"委托给另一台发电机"是什么意思?我怎样才能yield*"方便地组合发电机"?

[您可以使用--harmony-generators标志在Node v0.11.3中使用生成器.]

Fré*_*idi 42

委托给另一个发电机意味着电流发电机自动停止产生值,而是产生另一个发电机产生的值,直到它耗尽它.然后它恢复生成自己的值,如果有的话.

例如,如果secondGenerator()从产生数字1015,并firstGenerator()从产生数字15但委托给secondGenerator()制造之后2,然后通过产生的值firstGenerator()将是:

1, 2, 10, 11, 12, 13, 14, 15, 3, 4, 5
Run Code Online (Sandbox Code Playgroud)

function* firstGenerator() {
    yield 1;
    yield 2;
    // Delegate to second generator
    yield* secondGenerator();
    yield 3;
    yield 4;
    yield 5;
}

function* secondGenerator() {
    yield 10;
    yield 11;
    yield 12;
    yield 13;
    yield 14;
    yield 15;
}

console.log(Array.from(firstGenerator()));
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.事后来看很明显,但我发现很难看.一个改进是添加产生您提到的结果的示例代码. (9认同)

Ino*_*ble 5

委托收益不必委托给另一个生成器,而是委托给任何迭代器,因此第一个答案有点不确定。考虑这个简单的例子:

function* someGenerator() {
    yield 0;
    yield [1,2,3];
    yield* [1,2,3];
}

for (v of someGenerator()) {
    console.log(v);
}
Run Code Online (Sandbox Code Playgroud)

生成器本身内部没有其他函数 - 但yield* [1, 2, 3]委托给该Array.prototype[@@iterator]方法。