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. ASP.NET自定义处理程序

    要创建自定义处理程序,可以创建一个实现IHttpHandler接口的类. 该类有两个重要的参数:IsResuable属性和ProcessRequest方法.如果处理程序实例可以在不同的请求中重用,Is ...

  2. css浮动布局

    上次我们一起对盒子模型进行了一定的了解,今天我们就对css浮动布局做一下研究.首先我们来了解一下网页基本布局的三种形式. 首先我们来了解一下什么是网页布局: 网页的布局方式其实就是指浏览器是如何对网页 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合>讲了富文本编辑器UEditor的整合与使用 ...

  4. 为JQuery EasyUI 表单组件增加“焦点切换”功能

    1.背景说明 在使用 JQuery  EasyUI 各表单组件时,实际客户端页面元素是由 JQuery EasyUI 生成的,元素的焦点切换,虽然 Tab 键可以正常用,但顺序控制属性 tabinde ...

  5. Linux 安装Xampp以后,Apache服务器无法启动,以及启动后,连接sql数据库遇到的问题的解决方法

    xampp安装以后,搭建服务器的时候,我们会遇到哪些问题呢?1.MySQL Database 可以启动,而Apache Web Server无法启动?应该是80端口被占用,那么如何解决呢?我们可以通过 ...

  6. AngularJS学习笔记4

    9.AngularJS  XMLHttpRequest $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. <div ng-app="myApp" ...

  7. HTML在网页中插入音频视频简单的滚动效果

    每次上网,打开网页后大家都会看到在网页的标签栏会有个属于他们官网的logo,现在学了HTML了,怎么不会制作这个小logo呢,其实很简单,也不需要死记硬背,每当这行代码出现的时候能知道这是什么意思就o ...

  8. Linux密码保护

    在之前写了Linux密码破解的方法,虽然这样对于忘记密码时很方便,但同时别人也可以很轻易的破解你的Liunx虚拟机,安全问题存在隐患. 下面给出一些Liunx密码的安全防护操作: 1.防止破解root ...

  9. Vmware Vsphere WebService之vijava 开发一-vcenter连接、及集群信息获取

    开始是通过java代码调用vsphere提供的原始接口,从而控制vcenter的操作.当第一个版本做完之后发现代码执行的速度特别慢,后来在网上看到有人用vijava(对vsphere原始接口封装)编程 ...

  10. Springmvc的工作流程

    1.向服务器发送http请求,请求被前端控制器DispatcherServlet捕获. 2.DispatcherServlet根据servlet.xml中的配置进行URL解析后,得到(URL),然后根 ...