生成器函数中的委托产量(产量星,产量*)

IT技术 javascript ecmascript-6
2021-03-14 00:27:47

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

关于生成器ECMAScript 6 wiki还引入了“委托收益”yield*运算符,如下所示:

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

“委托给另一个生成器”是什么意思?如何使用yield*“方便地组合生成器”?

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

3个回答

委托给另一个生成器意味着当前生成器停止自己生成值,而是生成另一个生成器生成的值,直到它耗尽为止。然后它继续产生自己的值(如果有的话)。

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

1, 2, 10, 11, 12, 13, 14, 15, 3, 4, 5

好的。事后看来很明显,但我发现规格很难阅读。一项改进是添加产生您提到的结果的示例代码。
2021-05-10 00:27:47

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

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

for (v of someGenerator()) {
    console.log(v);
}

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

function *gimme1to2_10to15_3to5() {
    var ten = gimme10to15();
    yield 1; yield 2;
    for (var i = 10; i <= 20; i++)
        yield *ten;
    yield 3; yield 4; yield 5;
    }

function *gimme10to15() {
    for (var i = 10; i <= 15; i++)
        var x = yield i;
    }

let gen = gimme1to2_10to15_3to5();

var ar = [];
for (var i = 0; i < 12; i++)
    {
    var r = gen.next();
    ar [i] = r.value + (r.done ? "!" : "..");
    }
console.log (ar.join (", "));

结果是

1.., 2.., 10.., 11.., 12.., 13.., 14.., 15.., 3.., 4.., 5.., undefined!

笔记

  1. 带有yield *的函数要求来自内部生成器的 11 个值,但只收到它应该得到的 10..15。多余的yield *调用无效。

  2. 内部生成器done对其调用者返回done没有影响

  3. 输出显示未定义!最后,因为测试循环被编写为超出所需数量的值,以显示生成器的done = true

  4. 此输出来自 ES6 测试场Babel,上面展示的语义应被视为截至 2016 年 2 月 5 日的临时性。

yield *ten一样的yield* ten吗?
2021-05-10 00:27:47