[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 ...
随机推荐
- javascript --- jQuery --- Deferred对象
javascript --- jQuery --- Deferred对象 javascript的函数式编程是多么引人入胜,jQuery使代码尽可能的精简,intelligent! defer - 必应 ...
- git 换行符问题
git 换行符问题 在windows环境中 对于autocrlf = false 不会激发 关于换行符的处理 对于autocrlf = true 会在提交是将LF替换成CRLF 切出时时CRLF 对于 ...
- CentOS7 安装 swoole
sudo pecl install swoole 即可安装.安装完后修改php.ini,加入extension=swoole.so 重启 sudo systemctl restart php-fpm ...
- 整理string类常见方法的使用说明
整理String类的Length().charAt().getChars().replace().toUpperCase().toLowerCase().trim().toCharArray()使用说 ...
- C++11 之 " = delete "
1 缺省函数 设计一个类,没有成员函数 (member function),只有成员数据 (member data) class DataOnly { private: std::string st ...
- 动态创建二维vector数组 C和C++ 及指针与引用的区别
二维vectorvector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二维vector 动态创建m*n的二 ...
- jqueryMobile
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- Unable to find vcvarsall.bat解决方法
今天在安装scikit-learn时出现了 error: Unable to find vcvarsall.bat 在安装一些Python模块时,大部分是cpython写的模块时会发生如下错误 err ...
- 定制一个FlatBuffers编译器
个人并不喜欢FlatBuffers编译器生成的代码,原因是我已经习惯了unix风格的代码. 不喜欢之处大致有以下: 1 命名法使用了Pascal命名法,而我个人习惯了小写字母加下划线式的unix式命名 ...
- Linux查找文件夹名
@(编程) find / -type d -name filename type的类型 -type c File is of type c: b block (buffered) special c ...