美文网首页
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