1.Generator函数其实是一个封装了多个内部状态的状态机,执行它会返回一个遍历器对象,然后可以依次遍历Generator中的每一个状态,也就是分段执行,yield是暂停执行的标记,next恢复执行。

2.yield:

- 一个函数里面,return只能执行一遍,yield可以执行多次;

- Generator函数可以不用yield,这时就是一个简单的暂缓执行函数;

- yield只能用在Generator函数里;

- yield如果用在一个表达式里,必须放在圆括号里

function* foo() {
console.log('hello' + (yield));
console.log('hello' + (yield 'world'));
}

- yield用于函数参数或放在赋值表达式的右边,可以不加括号

function* demo() {
foo(yield 'a', yield 'b');
let input = yield;
}

3.可以把Generator函数赋值给对象的Symbol.iterator属性,从而使对象具有Iterator接口

var obj = {};
obj[Symbol.iterator] = function* (){
yield 1;
yield 2;
}; [...obj] // [1,2]

4.next方法的参数会被当做上一个yield的返回值,这样就可以在函数运行期间向内部传值。

5.for...of会自动遍历Generator函数生成的Iterator对象,不需要调用next方法。

// 实现Fibonacci数列
function* fib() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
} for (let n of fib()) {
if (n > 1000) break;
console.log(n);
}

6.遍历器对象的throw方法。

7.遍历器对象的return方法可以返回给定的值且终结遍历。

8.yield* 表达式用来在一个Generator函数里调用另一个Generator函数,而后面这个函数其实就是for...of的一种简写;

- yield* 后面如果跟着数组,则会遍历该数组;

- yield* 后面如果跟着字符串,也会遍历字符串;

- 如果后面的Generator函数有return语句,那么就可以像这个函数返回数据

function *foo() {
yield 2;
return "foo";
} function *bar() {
yield 1;
var v = yield *foo();
console.log( "v: " + v );
yield 3;
} var it = bar(); it.next() // {value: 1, done: false}
it.next() // {value: 2, done: false}
it.next() // "v: foo"
// {value: 3, done: false}
it.next() // {value: undefined, done: true}

9.作为属性的Generator: let obj = { * foo(){}};

10.Generator函数返回的遍历器对象是函数的实例,也继承了函数的prototype上的方法;

// 使用this
function* F() {
this.a = 1;
yield this.b = 2;
}
var f = F.call(F.prototype); f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: undefined, done: true} f.a //
f.b //

11.Generator函数的应用:

- 异步操作可以用同步写法;

- 控制流管理;

- 部署Iterator接口;

12.协程:多个线程互相协作,完成异步任务;Generator函数就是协程在es6的实现,其特点是交出函数的执行权。

13.Thunk函数其实就是传名调用,将参数放到一个临时函数中,用来替换某个表达式传入函数体。

function f(m) {
return m * 2;
} f(x + 5); // 等同于 var thunk = function () {
return x + 5;
}; function f(thunk) {
return thunk() * 2;
}

在js中,js是传值调用,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成一个只接受回调函数作为参数的单参数函数。Thunk 函数是自动执行 Generator 函数的一种方法。

// 正常版本的readFile(多参数版本)
fs.readFile(file, callback); // Thunk版本的readFile(单参数版本)
var Thunk = function (file) {
return function (callback) {
return fs.readFile(file, callback);
};
}; var readFileThunk = Thunk(file);
readFileThunk(callback);

es6之Generator的更多相关文章

  1. ES6中Generator

    ES6中Generator Generator是ES6一个很有意思的特性,也是不容易理解的特性.不同于let/const提供了块级作用域这样明显的目的,这玩意儿被搞出来到底是干嘛的? 首先我们需要明确 ...

  2. JS的ES6的Generator

    JS的ES6的Generator 1.Generator函数的概念: ES6提供的解决异步编程的方案之一,现在已经不怎么用了被淘汰了. Generator函数是一个状态机,内部封装了不同状态的数据. ...

  3. ES6的generator函数

    generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...

  4. 【ES6】Generator+Promise异步编程

    一.概念 首先我们要理解Generator和Promise的概念. Generator:意思是生成器,可以在函数内部通过yeild来控制语句的执行或暂停状态. *Foo(){ yeild consol ...

  5. es6编写generator报错

    首先babel基础包(不安装额外东西)并不是支持完整的es6语言 自己写的如下代码 let generator = function* () { ; ,,]; ; }; var gen = gener ...

  6. ES6中generator传参与返回值

    先看两个例子, 1, function* f() { for(var i=0; true; i++) { var reset = yield i; if(reset) { i = -1; } } } ...

  7. [ES6] 14. Generator -- 1. yield & next()

    Generators in ECMAscript 6 are first-class coroutines that produce encapsulated suspended execution  ...

  8. es6(15)--generator

    //generator处理异步,下一步用next,遇到return或者yied就会停止 { //generator基本定义 let tell=function* (){ yield 'a'; yiel ...

  9. ES6.0 Generator 三种用法

    // Generator start ------- thunk 用法 const Thunk = function(fn) { return function (...args) { return ...

随机推荐

  1. WCF和ASP.NET Web API在应用上的选择

    小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/shareto ...

  2. linux常用脚本

    转载于http://justcoding.iteye.com/blog/1943504 我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个l ...

  3. 24(java_io from keyboard)

    public class ReadFromKB{ public static void main(String args[]) { try { byte bArray[]=new byte[128]; ...

  4. Intellij IDEA 没办法创建java文件

    然后就是具体的解释和解决方案. 如上图红圈所示,我们可以根据对项目的任意目录进行这五种目录类型标注,这个知识点非常非常重要,必须会. Sources 一般用于标注类似 src 这种可编译目录.有时候我 ...

  5. 利用 Forcing InnoDB Recovery 特性解决 MySQL 重启失败的问题

    小明同学在本机上安装了 MySQL 5.7.17 配合项目进行开发,并且已经有了一部分重要数据.某天小明在开发的时候,需要出去一趟就直接把电脑关掉了,没有让 MySQL 正常关闭,重启 MySQL 的 ...

  6. Mac IDEA插件——protobuf 插件

    最近在搞PB的版本的升级,历史的PB的版本是2.4,现在是打算升级到3.2,当面PB的版本肯定有很多变化了,就不再这里多说了,这里重点说一说,采用IDEA的插件方便执行PB的文件的JAVA编译,这样的 ...

  7. js函数中this的指向

    本文是我个人对this指向的一些理解,如有不足之处,还望大家可以批评指正,在此先谢过了! 首先,我们来回顾一下ES5里函数的几种调用方式: 1⃣️直接调用 foo(); 2⃣️方法调用 obj.foo ...

  8. JS作用域就这么几句话

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  9. Typecho - MyTagCloud标签云插件

    一.前言: 标签云是博客.CMS类系统的常见功能,读者可以根据标签快速的查找和浏览自己喜欢的文章.个人很喜欢Typecho的简洁,但对于后台不能控制前台标签栏目的显示还是略表遗憾.令人高兴的是Type ...

  10. flex布局下,css设置文本不换行时,省略号不显示的解决办法

    大致是有一个main容器是flex布局,左边一个logo固定宽高,右边content动态宽度. <div class="main"> <img alt=" ...