生成器函数的意义在哪里?

由于异步任务的存在,我们需要达成完成前置条件后才会触发的一层一层的回调函数
由于直接书写,会导致回调地狱的存在,并且非常不利于维护
所以我们采取了,生成器函数的使用
利用生成器函数将需要前置的函数存在一个大生成器函数中,然后将生成器函数赋值给一个变量,使用next()方法
从而达到层层使用,一层一层推进,完成利于维护的异步代码

生成器函数的标志function * 函数名(){} 它的精髓就在于funcition 和 函数名中间的那个*号

function one() {
            setTimeout(() => {
                console.log("111");
                // 此时在one里面继续运行next()方法,既可以运行gun里下一条函数two,又可以传回one的返回值
                // 但是因为这个时候的next()小括号里没有传实惨,所以传回去的返回值是undefined
                fn.next();
            }, 1000);
        }

        function two() {
            setTimeout(() => {
                console.log("222");
                // 继续使用next()方法启动gun函数里two下面一条函数three
                fn.next();
            }, 1000);
        }

        function three() {
            setTimeout(() => {
                console.log("333");
                // 继续使用next()方法,虽然three下一条没有函数了,但是通过next()可以将three的返回值传输回去
                fn.next();
            }, 1000);
        }


        function * gen() {
            yield one();
            yield two();
            yield three();
        }
        //准备利用生成器函数gen搞事情
        let fn = gen();
        //使用生成器函数的next方法.这里是第一次使用next()方法,相当于告诉生成器函数开始使用了
        //然后生成器函数会自动运行第一条语句,但是此时第一条语句是没有返回值的
        fn.next();