Generator函数用于异步操作

2018-10-16  本文已影响14人  XJBT

Generator函数之所以可以用于异步操作是因为yield关键字,Generator函数在执行过程中遇到yield语句时就会暂停执行,并返回yield语句后面的内容,要想继续执行后续的代码就需要手动调用next方法。这样就找到了顺序执行异步操作的方法了,也就是将所有异步操作都放在yield关键字后面,同时在异步操作内配置相应的next方法,以便在异步操作结束后返回出操作的结果并交出执行权,来看下面这个例子,我们要读取多个文件的内容并输出,但是要求是必须先读完a.txt中的内容,打印出来以后再读取b.txt,最后是c.txt的内容,一般的回调写法如下:

读取多个文件操作 我们可以发现随着读取文件数目的增多,代码横向发展严重,也就是常说的callback hell不利于代码维护,那么用Generator函数怎么写呢? Generator函数改写读取文件操作 在这里我特意在read函数中设置了setTimeout以便观察读取的先后顺序(因为文件都很小,读取速度太快),执行结果如下图所示: 执行结果 可以发现我们通过封装read函数,再在reader这个Generator函数中调用他,从而达到了将异步操作写成了同步的形式,避免了callback hell现象,即使读取再多的文件也不会出现横向发展,但是主要缺点就在于需要自己去封装这样一个read函数,因为Generator函数中的yield只负责将执行权交出,而具体什么时候拿回执行权就需要人为控制,这也是为什么koa2中用async函数取代Generator函数的原因之一吧。
现在来分析一下封装的过程:
将读取文件的异步操作放进read函数中,等到读取操作结束时在内部调用next方法使Generator函数进行下一步操作,同时传出读取的内容。
如果不封装的话就无法确定后面操作的顺序,如下: 不封装异步操作 不封装的执行结果 进一步封装可以得到一个自执行器 自执行器
上一篇 下一篇

猜你喜欢

热点阅读