[ES6] 14. Generator -- 1. yield & next()
Generators in ECMAscript 6 are first-class coroutines that produce encapsulated suspended execution (暂停执行) contexts.
Yield values and iterate over them until no more values exist in the generator.
You use generator by adding a * after function keyword:
function* greeting(){
console.log(`You should call next()`);
}
greeting(); // Nothing happens
When you call greeting(), you will find nothing happens.
For better understaning what happened, let console out what greeting() returns:
function* greeting(){
console.log(`You called 'next()'`);
yield "hello";
}
let greeter = greeting();
console.log(greeter); //{next: [Function], throw: [Function]}
What you can see is greeter is actually an object. It didn't invoke:
console.log(`You should call next()`);
Call the next():
function* greeting(){
console.log(`You called 'next()'`);
}
let greeter = greeting();
let next = greeter.next();
console.log(next); // {value: undefined, done: true}
When calling the next(),
console.log(`You called 'next()'`);
are invoked, and the value of the next is undefined and done = true.
Why value is undefined?:
Because we didn't call any yield statment.
Why done is ture?:
Because it has gone thought all yield statmens (0 = gone thought)
So let us add yield statment:
function* greeting(){
console.log(`You called 'next()'`);
yield "hello";
}
let greeter = greeting();
let next = greeter.next();
console.log(next); // {value: "hello", done: false}
From the output we see, value has been chaned to "hello", but done is false.
So why done is false?:
Because we should call next() to make sure we have gone thought all the yield statmenets.
So let us add next() again:
function* greeting(){
console.log(`You called 'next()'`);
yield "hello";
}
let greeter = greeting();
console.log(greeter); //{next: [Function], throw: [Function]}
let next = greeter.next();
console.log(next); // {value: "hello", done: false}
let done = greeter.next();
console.log(done); // {value: "hello", done: true}
Example:
function* greeting(){
console.log(`Generators are "lazy"`);
yield "How";
console.log(`I'm not called until the second next`);
yield "are";
console.log(`Call me before "you"?`);
yield "you";
console.log(`Called when "done"`);
}
let greeter = greeting();
let next = greeter.next(); // Generators are "lazy" {value: "How", done: false}
You can see that it stop at the first yield. It won't go to next until you call next();
Meaning that you can put stuff in here (after the first yield) that's not created until you explicitly need it.
If add next() three more times, all statments will be output.
[ES6] 14. Generator -- 1. yield & next()的更多相关文章
- es6编写generator报错
首先babel基础包(不安装额外东西)并不是支持完整的es6语言 自己写的如下代码 let generator = function* () { ; ,,]; ; }; var gen = gener ...
- ES6中Generator
ES6中Generator Generator是ES6一个很有意思的特性,也是不容易理解的特性.不同于let/const提供了块级作用域这样明显的目的,这玩意儿被搞出来到底是干嘛的? 首先我们需要明确 ...
- JS的ES6的Generator
JS的ES6的Generator 1.Generator函数的概念: ES6提供的解决异步编程的方案之一,现在已经不怎么用了被淘汰了. Generator函数是一个状态机,内部封装了不同状态的数据. ...
- Python generator和yield介绍
Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观.无论学 ...
- generator 和 yield
yield 的使用 generator 生成器 yield 可以使生成器返回多次 我习惯于从表象推测,不喜欢官方文档,写的字都认识,结果变成句子之后,就一句都看不懂 所以先举一个例子来看一下这个东西怎 ...
- 14 Generator
Generator 就是可以返回多个结果,也是支持 Iterator 接口. function* helloWorldGenerator() { yield 'hello'; yield 'world ...
- es6之Generator
1.Generator函数其实是一个封装了多个内部状态的状态机,执行它会返回一个遍历器对象,然后可以依次遍历Generator中的每一个状态,也就是分段执行,yield是暂停执行的标记,next恢复执 ...
- ES6的generator函数
generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...
- [Advanced Python] 14 - "Generator": calculating prime
高性能编程 几个核心问题 • 生成器是怎样节约内存的?• 使用生成器的最佳时机是什么?• 我如何使用 itertools 来创建复杂的生成器工作流?• 延迟估值何时有益,何时无益? From: htt ...
随机推荐
- latex公式中的空格如何表示
两个quad空格 a \qquad b 两个m的宽度 quad空格 a \quad b 一个m的宽度 大空格 a\ b 1/3m宽度 中等空格 a\;b 2/7m宽度 小空格 a\,b 1/6m宽度 ...
- PASCAL相关图书推荐
PASCAL程序设计(第2版) 作 者 郑启华 著 出 版 社 清华大学出版社 出版时间 2013-01-01 版 次 2 页 数 286 印刷时间 2013-01-01 ...
- [Lua]入门教程
什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...
- 调用openoffice Com组件转换成PDF
//例子 OpenOfficeExportToPDF('file:///C:/SourceFile.odt', 'file:///C:/TargetFile.pdf'); 必须为URL格式的路径 ...
- Ubuntu上安装zsh
先安装zsh,同时移除之前可能的oh-my-zsh的安装 sudo apt-get install zsh if [ -d ~/.oh-my-zsh ]; then rm -r ~/.oh-my-zs ...
- nodejs cmd
引入系统模块 var exec = require('child_process').exec; cmd.js var exec = require('child_process').exec; va ...
- Scene View Navigation
[Scene View Navigation] Hold the right mouse button to enter Flythrough mode. This turns your mouse ...
- UDP广播问题
http://bbs.csdn.net/topics/390218123 Broadcast Address(广播地址)是专门用于同时向网络中所有工作站进行发送的一个地址.在使用TCP/IP 协议的网 ...
- to_number,Extract oracle的关键字
to_number(Extract(year from 字段名)) 简介:获取时间字段的年份后转换为数字
- C++视频课程小结(2)
C++远征之离港篇 章节介绍: 每章小结: 第一章:大致讲了一下本章会讲的内容:引用vs指针.const vs #define(这个我在C里都没用过).函数变得更强大.内存管理要小心之类的. 第二章: ...