说起generator函数,先要了解它和普通函数的区别!大家都知道普通函数是不可阻断和挂起的,generator函数是可以阻断的,很多文档都喜欢用等待,但是我更喜欢使用阻断! generator函数语法不难,*和yield,它生成一个迭代器,如果不清楚迭代器概念的,请自行百度。迭代器会对外暴露一个next方法,用来获取generator函数的相关yield内容。下面我们来看个例子:
图中可以看出,我们调用test1生成了一个名为testGene的迭代器,迭代器对外暴露了一个next方法,我们调用next方法,迭代器依次返回包含字test1和test2的对象,心细的你还会发现,返回对象中还有一个done,done这个是用来表示迭代器对象是否变量结束,是否还能获得新值!如果done的值为false,说明还能通过调用next方法获得新值,如果done的值为true,说明已经无法通过next方法获得新值!
做个小总结:generator函数产生一个迭代器,迭代器对外暴露一个next方法,通过这个方法,获得迭代器的yield的值,同时获得done,用来表示下一次next是不是能获取到值。
看过上面的总结,我们来验证下一个问题,如果值没有在yield后面,看看迭代器能不能获取到,我们来测试下。
测试结果验证了上面的结论,同时为我们执行同步操作提供了方案!调用test方法,返回一个test的迭代器函数,同时触发第一个console.log,然后迭代器函数通过next方法,唤醒test这个构造函数,获得yield后面的值test1,等到yiled后面的值获取后,因为下一行代码还是yield,所以继续通过next方法获取,接着,关键来了,获取test2这个值后,因为下面不再是yield,而是console.log,所以就执行了console.log,输出test3,然后才是最后一个next方法执行。
应用场景有很多,比如解决一些依赖问题,回调地狱啥的,具体请大家自行百度!