美文网首页
Generator函数

Generator函数

作者: _花 | 来源:发表于2017-10-18 14:07 被阅读0次

Generator函数是一种异步编程解决方案。他好比一个状态机,封装了多个内部状态。

执行Generator函数会返回遍历器对象(ITerator Object);

1.Generator函数定义

    function*  g(){.................}//一般都这么写

2.yield语句

Generator函数正是运用yield语句来定义内部不同的状态。例如:

```

function*  f(){

            yield 'hello';

            yield 'world;

            return 'ednding'

}

```

Generator返回的遍历器对象只能调用next()方法来遍历他的内部状态,next()方法的执行逻辑:

遇到yield语句就暂停执行;

下次调用next()方法的时候再继续执行,直到遇到下一个yield语句;

如果下面没有yield语句,就一直向下运行,那遇到return语句为止;

如果没有return语句,则运行到函数尾部,并返回value:undefinned;

注意:

(1)yield后面的语句不会执行,只有在next()方法将指针移到这一句时才求值,例如:

```

function* gen(){

           console.log('执行了’)

}

vargenerator = gen();                  //此处没有任何输出 gen() 仅仅是创建了一个generator对象,还没有去执行它

generator.next();                  //此处输出为“执行了”

```

(2)yield语句不能在普通函数里,否则会报错。

3.next方法参数

yield语句没有返回值,所有都返回undefined;例如:var r = yield 1; r其实值为undefined

next 方法可以带参数,该参数作为上一条yield语句的返回值。

4.for...of循环(原生的JavaScript对象没有遍历接口,所以无法使用for...of循环)

for...of 循环可以自动遍历Generator函数,而不用再使用next 方法;例如

```

function* foo(){

            yield 1;

             yield 2;

             yield 3;

             yield 4;

             return 5;

}

for(let v of foo()){

            console.log(v)

}

//1,2,3,4

```

注意:一旦next返回对象的done属性为true,for...of 就会终止,且不包含该返回对象

5.Generator.prototype.return()

Generator函数返回的遍历器对象还有一个return方法,可以返回给定的值,并终结Generator函数的遍历。

仍沿用4里面的例子:

```

                                var f = foo();

                                  f.next()    //{value:1,done:false}

                                  f.return("foo")     //{value:"foo",done:true} 如果return方法里面没有跟参数那么返回值value为undefined

                                  f.next()    //{value:undefined,done:true}

```

6.yeild* 语句

如果在Generator函数内部调用另一个Generator函数默认情况下是没有效果的;

这是就要用到yield*语句

7.作为对象属性的Generator函数

```

let obj = {

* myGeneratorMethod(){

                  ...........

}

```

8.Generator函数的this指针

Generator函数总返回一个遍历器,ES6规定这个遍历器是Generator函数的实例,他也继承了Generator函数的prototype的对象上的实例。

相关文章

网友评论

      本文标题:Generator函数

      本文链接:https://www.haomeiwen.com/subject/efysuxtx.html