什么是Generator
函数
Generator
函数与普通函数的区别是该函数可以分步骤阻塞,不像普通函数需要一路走到底,就像是Generator
生成一堆的小函数,只有主动调用next()
才会一个个的执行这些小函数。总结起来就是Generator
函数中间可以停下来,可以使用yield
来暂时的放弃执行。
拿一个形象的例子:普通函数好比是坐高铁或者乘坐飞机,我们只有到达目的地了,才停止下来,中间是不允许有停歇的,但是
Generator
函数好比是乘坐计程车,当我们需要在某个地方去做什么事,比如上个厕所,是可以叫师傅在某地方等一会,回来了再继续赶往目的地
yield
的理解与使用
Generator
是一个状态机,封装了多个内部状态,执行Generator
函数会返回一个遍历器对象,返回的遍历器对象,可以使用next
依次遍历Generator
函数内部的每一个状态。Generator
函数是分段执行的,yield
表达式是暂停执行的标记,而next
方法可以恢复执行。Generator
函数的执行必须靠执行器。
yield
可以传参也可以返回内容(一般的返回的是上一步执行的结果)。一个yield就是一堵墙,墙的两面都是小的函数,只有墙的一面的函数执行完了,才可以接着执行另一面的函数。如下图帮助理解:
yield
传参的形式与意义,如下图:
Generator
与yield
综合使用,如下伪代码:
Generator
相比Promise
的优势
Promise
也是处理异步的,但为什么会再出现generator
,是因为当我们使用promise
的时候,如果中间需要有一些逻辑的判断,则这样写出来的promise
代码相比普通的函数而言是没有任何的优势的。但是如果使用generator
可以简化很多,并且是有序,正确的执行 每道工序。
总结:
promise
适合处理一次读一堆的异步操作,而generator
适合在读的过程中有一些逻辑的处理,分批,有顺序的处理。简单的来说是generator
是对promise
的封装
async
函数
async
函数是Generator
函数的语法糖,将Generator
的星号换成async
将yield</