JavaScript 中的 yield 关键字是什么?

2022-08-30 00:12:45

我听说过JavaScript中的“yield”关键字,但我发现关于它的文档非常糟糕。有人可以解释我(或推荐一个解释)它的用法和用途的网站吗?


答案 1

迟到的答案,可能现在每个人都知道,但是出现了一些更好的文档。yield

将 James Long 的“Javascript's Future: Generators”中的一个例子改编为官方 Harmony 标准:

function * foo(x) {
    while (true) {
        x = x * 2;
        yield x;
    }
}

“当你调用foo时,你会得到一个生成器对象,它有一个下一个方法。

var g = foo(2);
g.next(); // -> 4
g.next(); // -> 8
g.next(); // -> 16

所以有点像:你得到一些东西回来。 返回 的值,但返回一个函数,该函数为您提供了一个迭代到下一个值的方法。如果您有一个可能占用大量内存的过程,并且可能希望在迭代期间中断,则该过程非常有用。yieldreturnreturn xxyield x


答案 2

这真的很简单,这就是它的工作原理

  • yield关键字只是帮助在任何时间异步暂停恢复函数。
  • 此外,它还有助于从生成器函数返回值

以这个简单的生成器函数为例:

function* process() {
    console.log('Start process 1');
    console.log('Pause process2 until call next()');

    yield;

    console.log('Resumed process2');
    console.log('Pause process3 until call next()');

    let parms = yield {age: 12};
    console.log("Passed by final process next(90): " + parms);

    console.log('Resumed process3');
    console.log('End of the process function');
}

设 _process = process();

在你调用_process.next()之前,它不会执行前2行代码,然后第一个收益暂停函数。要恢复函数直到下一个暂停点(yield 关键字),您需要调用_process.next()

您可以认为多个收益是单个函数中 javascript 调试器中的断点。在您告诉导航下一个断点之前,它不会执行代码块。(注意:不阻挡整个应用程序)

但是,当 yield 执行此暂停和恢复行为时,它也可以根据上一个函数返回一些结果,我们没有发出任何值。如果我们浏览前面的输出,它将在未定义的值下显示相同的值。{value: any, done: boolean}{ value: undefined, done: false }

让我们深入了解收益关键字。(可选)您可以添加表达式并设置分配默认可选值。(官方文档语法)

[rv] = yield [expression];

表达式:从生成器函数返回的值

yield any;
yield {age: 12};

rv:返回传递给生成器的 next() 方法的可选值

简单地说,您可以使用此机制将参数传递给process()函数,以执行不同的产量部分。

let val = yield 99; 

_process.next(10);
now the val will be 10 

立即试用

用法

  • 惰性求值
  • 无限序列
  • 异步控制流

引用: