My Book

ES6 Generator

Generator函数是ES6引入的新型函数,用于异步编程,跟Promise对象联合使用的话,会极大降低异步编程的编写难度和阅读难度。

对于promises的理解

Generator函数和普通函数的写法有很大的区别:

    1.function关键字和函数名之间有一个*;

    2.函数体内部使用yield语句,定义不同的内部状态

        最简单的Generator函数如下:

            function * gen(){
                yield "a";
                yield 1;
                yield "c";
                return "ending";
            }

            gen()返回的是一个Generator对象
            gen函数有四个阶段,分别为a,1,c,ending。

    3、Generator函数神奇之一:gen()并不执行gen函数

        gen()并不会执行gen函数,返回的也不是函数运行结果
        而是一个指向内部状态的指针对象,也就是迭代器对象(Iterator Object);

    4、Generator函数神奇之二: 分段执行

        var g = gen();
        g.next();-----返回的是一个非常简单的对象{value:"a",done:"false"}
                            value指的是一个yield语句之后得到的值
                            false表示gen函数还没执行完,只是在这暂停

        g.next();-----返回的是一个非常简单的对象{value:1,done:"false"}
                            value指的是一个yield语句之后得到的值
                            false表示gen函数还没执行完,只是在这暂停

        g.next();-----返回的是一个非常简单的对象{value:1,done:"false"}
                            value指的是一个yield语句之后得到的值
                            false表示gen函数还没执行完,只是在这暂停

        如果再写一行g.next();返回的是{value:ending,done:"true"}

        之后写一行g.next();返回的是{value:undefined,done:"true"}

    备注1:如果没有写return语句

    那么第三次g.next()之后就返回{value:undefined,done:"true"}
    这个第三次的next()唯一的意义就是证明g函数全部执行完毕了。


    备注2:如果return后面还有yield

    return表示函数的所有有效语句借宿,无论下方还有多少语句都不会执行


    备注3:如果函数没有yield和return语句

    g.next()调用后就直接返回{value:undefined,done:"true"}

目前就理解到此---需要继续理解

以下需要理解的Generator的地址