yield

yield 关键字用来暂停和恢复一个生成器函数(function*

举例:

function* gen(index) {while (index < 2) {yield index++;}
}const iterator = gen(0);console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
// 0
// 1
// undefined

语法:

[rv] = yield [expression];
  • expression:从生成器函数中返回的值。如果省略,则返回undefined
  • rv:检索传递给生成器的next()方法的可选值,以恢复其执行。

yield关键字使 生成器函数 暂停执行,yield关键字后面的表达式的值 返回给生成器的调用者。可以理解成是一个基于生成器的版本的return关键字。(It can be thought of as a generator-based version of the return keyword.)

yield只能从直接包含它的生成器函数中调用。不能从嵌套函数或回调中调用它。

yield关键字会导致对生成器的next()方法的调用,这个方法会返回具有两个属性valuedone的IteratorResult对象。value属性是对yield后面跟的表达式求值的结果,当done值为false时,表示生成器函数尚未完全完成。

一旦遇到 yield 表达式,生成器的代码执行就会暂停,直到生成器的 next() 方法再次被调用。每次调用生成器的next()方法时,生成器都会恢复执行,直到遇到以下情况:

  • yield,遇到yield导致生成器再次暂停执行并返回生成器的新值。 下一次调用next()方法时,在yield之后紧接着的语句将继续执行。
  • **throw **,用于从生成器中抛出异常。它完全停止了生成器的执行。当异常抛出时,通常情况下,在调用者中恢复执行。
  • 生成器函数迭代完毕,在这种情况下,生成器执行结束,并且IteratorResult给调用者返回value属性的值是undefineddone属性为true
  • 遇到 return 语句。在这种情况下,生成器执行结束,并将IteratorResult返回给调用者,其value属性的值是return语句后面表达式的值的,done属性 为true

如果给生成器中的next()方法传递参数,则该值将成为生成器当前yield操作返回的值。

在整个生成器代码运行中,yield操作符,以及向Generator.prototype.next()方法中传递一个参数指定起始值,生成器提供了强大的控制作用。。。

举例:
下面的代码声明了一个 生成器函数

function* countName(){let name = ['happy','chen','666'];for (let i = 0; i < name.length; i++) {yield name[i];}
}

一旦生成器函数已定义,可以通过构造一个迭代器来使用它:

function* countName(){let name = ['happy','chen','666'];for (let i = 0; i < name.length; i++) {yield name[i];}
}let nameIterator = countName();
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
// { value: 'happy', done: false }
// { value: 'chen', done: false }
// { value: '666', done: false }
// { value: undefined, done: true }

yield*

yield* 表达式用于委托给另一个generator 或可迭代对象。

语法:

 yield* [[expression]];
  • expression:返回一个可迭代对象的表达式。

yield* 表达式迭代操作数,并产生它返回的每个值。yield* 表达式本身的值是当迭代器关闭时返回的值(即done为true时)。

举例:

委托给其他生成器

以下代码中,g1() yield 出去的每个值都会在 g2() 的 next() 方法中返回,就像那些 yield 语句是写在 g2() 里一样。(values yielded by g1() are returned from next() calls just like those which are yielded by g2().)

function* g1() {yield 2;yield 3;yield 4;
}function* g2() {yield 1;yield* g1();yield 5;
}let iterator = g2();console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// { value: 1, done: false }
// { value: 2, done: false }
// { value: 3, done: false }
// { value: 4, done: false }
// { value: 5, done: false }
// { value: undefined, done: true }

委托给其他可迭代对象

除了生成器对象这一种可迭代对象,yield* 还可以 yield 其它任意的可迭代对象,比如说数组、字符串、arguments 对象等等。(Besides generator objects, yield* can also yield other kinds of iterables, e.g. arrays, strings or arguments objects.)

function* g3() {yield* ['happy', 'chen'];yield* 'is';yield* Array.from(arguments);
}let iterator = g3('a', 'Front-end', 'development', 'engineer');
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// { value: 'happy', done: false }
// { value: 'chen', done: false }
// { value: 'i', done: false }
// { value: 's', done: false }
// { value: 'a', done: false }
// { value: 'Front-end', done: false }
// { value: 'development', done: false }
// { value: 'engineer', done: false }
// { value: undefined, done: true }

yield* 表达式的值

yield 是一个表达式*,不是语句,所以它会有自己的值

function* g4(){yield* [5,2,0];return '可达鸭';
}let result;function* g5(){result = yield* g4();
}let iterator = g5();console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());console.log(result);
// { value: 5, done: false }
// { value: 2, done: false }
// { value: 0, done: false }
// { value: undefined, done: true }// 可达鸭

yield 和 yield*相关推荐

  1. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  2. python yield from yield_python yield和yield from用法总结详解 python yield和yield from用法总结...

    #!/usr/bin/env python # -*- coding: utf-8 -*-from inspect import isgeneratorfunction def fab(max): n ...

  3. python yield from_简述 yield 和 yield from

    yield 函数可以看成是一堆指令的集合.在函数中加入yield可以把一个函数变成一个generator,虽然调用的方式不一样了,但是其实现的功能和原来的函数基本是一样的. 而yield在这其中的作用 ...

  4. python协程--yield和yield from

    字典为动词"to yield"给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 n ...

  5. 从yield 到yield from再到python协程

    yield 关键字 def fib():a, b = 0, 1while 1:yield ba, b = b, a+b yield 是在:PEP 255 -- Simple Generators 这个 ...

  6. 从yield到yield from

    yield 带有 yield 的函数不再是一个普通函数,而是一个生成器generator 把生成器当作管道 def add_A(seq):for item in seq:yield item + '- ...

  7. yield 跟 yield * 的区别

    yield表达式的值,是下一个iter.next的参数值 yield*表达式的值,是yield*后的iterable在done为true时的value值. yield * 的使用: function* ...

  8. js中的yield、yield*和Generator函数

    基本概念 yield和yield*都是js中的关键字,他们不能直接使用:只能配合Generator进行使用:Generator是一种函数,声明方式和普通函数类似,只不过要在function后面加个*( ...

  9. python进阶:yield与yield from

    目录 yield与生成器 send close throw yield from yield与生成器 前面我们介绍过生成器:迭代器.可迭代对象.生成器的区别和联系 使用了 yield 的函数被称为生成 ...

最新文章

  1. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键
  2. php javabean对象,Struts2 bean标签:创建并示例化一个JavaBean对象
  3. boost::hof::implicit用法的测试程序
  4. 小程序跨行跨列多列复杂表格实现
  5. ubantu java编辑器_Linux Ubuntu中最好的代码编辑器 程序员都这么看吗?
  6. 关于ssh的一篇很好的文章
  7. vector, list, deque的使用区别
  8. 作用域闭包,你真的懂了吗?
  9. 需要友元的原因及使用
  10. mysql复制以及一主多从等常见集群概述
  11. 关于linux目录~ / .
  12. Filezilla client站点出现中文乱码的解决办法
  13. 苹果电脑修改MAC地址方法
  14. 图解联合概率密度、边缘概率密度、条件概率密度之间的关系
  15. 计算机有很多的优点英语,电脑的优点和缺点英文作文
  16. uni-app微信小程序跳转公众号;微信小程序打开公众号;微信小程序识别二维码添加好友;微信小程序通过公众号添加好友;小程序里识别企业微信二维码点击联系人名片无反应?
  17. 微型计算机芯片上的位数,微处理器芯片的位数指的是什么
  18. 小红书购物笔记在哪里看?
  19. 硬盘开盘数据恢复成功,笔记本硬盘开机无法识别到硬盘
  20. 云运维 linux centos7.2 LAMP环境搭建 一键全解析

热门文章

  1. 招行数据岗笔试题- 信用卡推荐客户列表
  2. 女朋友生病了要你去照顾,这时候你刚开了一把王者荣耀排位晋级赛,你选什么?
  3. IDEA输入字母间距变大报红处理方法
  4. 35 米色系网页设计
  5. Python3.x:第三方库简介
  6. android图标未读消息,Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示...
  7. 新手做电商直播带货怎么和快递合作谈价格
  8. 软件企业认定条件政策
  9. C语言外挂实战【转】
  10. 【Java基础[数组及对象数组取子数组]】