理解 ES6 语法中 yield 关键字的返回值

在 ES6 中新增了生成器函数的语法,本文解释了生成器函数内 yield 关键字的返回值。

描述

根据语法规范,yield 关键字用来暂停和继续执行一个生成器函数。当外部调用生成器的 next() 方法时,yield 关键字右侧的表达式才会执行。

执行结果会转化为一个对象(包含两个属性, value 和 done),作为 next() 方法的返回值。

对于  var foo = yield expression 语句,yield 左侧变量 foo 的值将在下一次调用 next() 方法时获得,并且等于调用时 next() 方法的参数。

举例

首先构造一个生成器函数。

function* numbers() {
    console.log(‘function start.‘);

    var v1 = yield 0;
    console.log(‘v1 = ‘ + v1);

    var v2 = yield 1;
    console.log(‘v2 = ‘ + v2);

    return 5;
}

var nums = numbers();

下面调用生成器函数。

// 第 1 次调用 next, v1 的值还没有返回.
console.log(nums.next(2)); 

程序输出如下。

function start.
{ value: 0, done: false }

接着,执行第二次调用。

// 第 2 次调用 next, next 参数作为上一次 yield 值返回给 v1.
console.log(nums.next(3)); 

此时程序输出如下。

v1 = 3
{ value: 1, done: false }

最后,执行第三次调用。

// 第 3 次调用 next, 此时 done 的值为 true, 直接返回 return 的值.
console.log(nums.next(4)); 

程序结束执行,输出如下。

v2 = 4
{ value: 5, done: true }

扩展阅读

  1. yield 关键字
  2. 生成器函数语法 (function*)
  3. 异步操作和Async函数
时间: 2024-10-06 16:03:43

理解 ES6 语法中 yield 关键字的返回值的相关文章

C#中yield关键字理解

yield关键字之前用得较少,但是在做项目开发的过程中也遇到了,当时有点迷惑,就顺便研究学习了一下,以下是个人理解,不到之处欢迎拍砖!废话就到这,上代码: class Program { static void Main(string[] args) { string[] strs = new string[] { "1", "2", "3", "4" }; foreach (var item in GetInts(strs)

C#中yield关键字的使用个人总结

C#中yield关键字的使用个人总结: 1.首先,yield必须与return或者break组合在一起才能使用. 2.其次,必须在循环体中使用. 3.必须在迭代器块代码中使用. 在foreach语句中,in 后面跟随的对象,必须是IEnumerable“对象”(注:事实上,在C#里,接口是没有实例化的对象.但是,我们是可以创建“接口类型”的变量.然后可以把“继承了该接口的类”的对象赋给该变量.通过接口的多态性,使用这个变量.如果把接口理解成类,就很好理解了:若BClass继承于AClass,对于

【转载】理解C语言中的关键字extern

原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻译了一下.(原文:http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/)   我确定这篇文章对c语言的初学者会有很大的帮助,因为这将使他们更好更熟练的使用c语言.所以就让我先来说说extern关键字在变量和函数上的应用.最基本

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for

Java基础---Java中无参数无返回值方法使用(三十六)

Java 中无参无返回值方法的使用 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 " welcome to imooc. " 注意哦: 1. 方法体放在一对大括号中,实现特定的操作 2. 方法名主要在调用这个方法时使用,需要注意命名的规范,一般采用第一个单词首字母小写,其它单词首字母大写的形式 第二步,调用方法 当需要调用方法执行某个操作

Java基础---Java中带参数无返回值方法的使用(三十九)

Java 中带参无返回值方法的使用 有时方法的执行需要依赖于某些条件,换句话说,要想通过方法完成特定的功能,需要为其提供额外的信息才行.例如,现实生活中电饭锅可以实现"煮饭"的功能,但前提是我们必须提供食材,如果我们什么都不提供,那就真是的"巧妇难为无米之炊"了.我们可以通过在方法中加入参数列表接收外部传入的数据信息,参数可以是任意的基本类型数据或引用类型数据. 我们先来看一个带参数,但没有返回值的方法: 上面的代码定义了一个 show 方法,带有一个参数 name

Java 中无参带返回值方法的使用

如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 calSum( ) 方法中,返回值类型为 int 类型,因此在方法体中必须使用 return 返回一个整数值. 调用带返回值的方法时需要注意,由于方法执行后会返回一个结果,因此在调用带返回值方法时一般都会接收其返回值并进行处理.如: 运行结果为: 两数之和为:17 不容忽视的“小陷阱”: 1. 如果方

SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法

Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type".一般的请求都是通过浏览器进行的,request heade

Java基础---Java中无参数带返回值方法的使用(三十七)

Java 中无参带返回值方法的使用 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 calSum( ) 方法中,返回值类型为 int 类型,因此在方法体中必须使用 return 返回一个整数值. 调用带返回值的方法时需要注意,由于方法执行后会返回一个结果,因此在调用带返回值方法时一般都会接收其返回值并进行处理.如: 运行结果: 不容忽视的"小陷阱&