es6之Generator

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 // 1
f.b // 2

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);
时间: 2024-07-31 22:40:54

es6之Generator的相关文章

JS的ES6的Generator

JS的ES6的Generator 1.Generator函数的概念: ES6提供的解决异步编程的方案之一,现在已经不怎么用了被淘汰了. Generator函数是一个状态机,内部封装了不同状态的数据. 用来生成遍历器对象 暂停函数,yield关键字暂停,next()方法启动,yield可以获得next方法传递过来的数据,如果无数据yield返回undefined,如果有数据则返回数据. 2.Generator使用: 1 function* generatorExample(){ 2 let res

es6,promise,generator,next,yield与koa

es6里有了很多新特性 promise是一种形式,使用promise可以让异步的代码像同步代码,从而更符合人类的思维方式,使回调函数的写法变得轻松 在函数中使用promise,一般是return一个用promise包裹的函数,如: 1 function t(arg){ 2 //准备工作,处理等 3 // ... 4 var istrue =arg+1 5 //处理结束 6 return new promise(function(resolve,reject{ 7 //判定并返回 8 if(ist

ES6的Generator函数

1.简介 Generator函数是一个函数的内部状态的遍历器(也就是说,Generator函数是一个状态机). 形式上,Generator函数是一个普通函数,但是有两个特征. function命令与函数名之间有一个星号*: 函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态. function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } let hw = helloWorld

[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 keywor

ES6.0 Generator 三种用法

// Generator start ------- thunk 用法 const Thunk = function(fn) { return function (...args) { return function (callback) { return fn.call(this, ...args, callback); } };};const run_thunk = function (fn) { var gen = fn(); function next(data) { var resul

ES6中generator传参与返回值

先看两个例子, 1, function* f() { for(var i=0; true; i++) { var reset = yield i; if(reset) { i = -1; } } } var g = f(); document.write(g.next().value) // { value: 0, done: false } document.write(g.next().value) // { value: 1, done: false } document.write(g.

学些ES6:generator

Generator: 创建: function* g() {} // g: [object Generator] let g = function*() {}; let obj = {*g() {}}; const generatorName = 'g';let obj = {*[generatorName]() {}}; const generatorName = 'g';class Klazz {*[generatorName]() {}} iterator: const generator

【es6】Generator 函数

1. 基本概念 状态机,封装了多个内部状态 2. 应用 返回一个遍历器对象. 3. 代码形式 function* helloWorldGenertor() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenertor(); 调用 hw.next() hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', d

ES6知识点-Generator

4.2Generator函数 4.2.1定义Generator函数 通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,从而为异步编程提供解决方案. 形式上,Generator函数是一个普通函数,但是有两个特征. function关键字与函数名之间有一个星号: 函数体内部使用yield语句,定义不同的内部状态(yield翻译为汉语的意思就是"产出") function* func() { yield 'hello'; yield 'world'; return 'e