00:00
哈喽,大家好,这个小节呢,我们来做一个生成器的函数的一个实例。啊,那么咱们说了啊,生成器函数呢,是专门来针对于异步编程的一个新的解决方案。啊,然后呢,咱们这个小节来演示一下。那么首先异步编程这一块呢,我们先说一下,就是整个GS呢,它本身是一个单线程的啊。异步单线程。啊,所以说很多操作都是异步来完成的,特别是IO这一块。啊,你比如说我们这个文件操作。比如说文件读取是吧,然后文件夹等等操作,这些都是异步的,再比如说网络操作。包括我们的阿贾克斯,还包括这个爬虫request请求,这些也是异步的。还有呢,数据库操作。这里也是异步的。好,那么有些同学可能没有接触过啊,这里边儿关于文件操作啊,或者数据库这块可能没有接触过,那我们这个小节呢,用一个定时器的案例。
01:09
因为定时器它也是异步的嘛,对不对,我们用一个定时器的案例来给大家演示一下生成器函数在异步编程当中的一个表现。好,首先这是一个需求。啊,一秒钟以后在控制台输出111。然后注意是,然后两秒钟以后输出222。然后三秒钟以后输出333。也就是说整个的这个结果,整个这个代码的一个运行需要几秒呢?需要六秒钟。才能让123全部输出出来。如果说我们按照原来做法,就定时器来去,就是一层一层套的话,肯定是可以实现的,我们一起来实现,一起来做一下。哎,在这走。一秒。
02:00
然后里边呢,来一个LOG111。然后现在的话,我把代码复制一份。拿过来这块呢,我变成一个222这儿呢,我写一个二。这我写一个333啊,这呢我来个三。好了,大家看一下,那么现在咱们看效果啊,一秒两秒1233秒出结果。我们这样做的话就能完成这个效果。但是。啊,如果说我们以后啊,后边还要再跟新的异步任务的话,那这里还要再去写一层。如果还有,还要再写,那么这个时候你会发现代码的缩进会不断的向前推进。啊,不断的向前推进啊,然后呢,你如果说义务任务特别长,甚至还有可能呢,超出我们编辑区。那样的话呢,阅读起来不方便,而且调试错误也不是很方便。指咱们当前来给他演示一个这样的一个现象,这个现象呢,咱们把它称之为回调地域。
03:05
就不停的回调,不停的回调,一层套一层,那同学说这个呃,会有这样的情况发生吗?当然会有是吧?当然会有,如果说呃,我们没有新的异步解决方案的话,我们只能是通过回调里边特回调啊,比如说咱们这个请求要求读取很多数据。那就你先读一个,再读一个,再读一个,层层回,掉一层套一层。好了,这是一个毁掉地的演示。那么接下来的话呢,我们就开始通过生成器函数。来给大家呢,来做一个演示,就是用生成期函数,我们该怎么去做。看好,现在呢,我这样来做,就是声明三个函数。这三个函数呢?来分别完成三个异步任务。第一个呢,是输出一的这个任务。这是一的,然后现在我再声明一个函数,这个函数呢,是用来做第二个异步任务的,T wo在这儿,222这块来个二。
04:07
然后下边呢,这块再来一个函数three,这是任务三啊,用来输出三的三秒钟。好保存,保存完以后呢,这是三个任务,我放到了不同的函数里边,接下来我用一个生成器函数。然后里边呢,我们开始把这三个任务呢放过来,写一个ill的。啊,然后呢,One。再来ill的。啊,然后来一个T。啊,再来一个I的,然后the。保存。这样一来呢,我们就把这三个函数放它的调用啊,放到了E的语句里边。接下来我们开始调用这个函数,调用生乘器函数let it等于一个G,然后接下来it.next我们就让这个生成器函数里边代码呢运行起来,它第一次呢,肯定是先走先走这块。
05:11
啊,像这一块好了,我们保存执行Y函数除一。出来之后呢,问题就来了,为什么呢?因为这个一有了以后呢,二不走。那我们想要二走,该怎么办呢?哎,我们可以这样来做,就是把it这块放这点next保存。好,那完了之后呢,咱们下边再接着继续走,把二呢也放过来,把三呢也放过来,保存一秒钟走这儿是吧,再过完之后再掉走这儿,再调走这。这样的话,我们就完成了一个啊,这三个异步任务的一个功能,而且你注意观察一下,我们缩小一下,你看一下这个代码的缩进是有头的。啊,到这儿以后就不会再向前推进了,如果你有新的任务也是如此,他不会再往前不停的缩进,所以说回调地域这个问题就被他解决了。
06:10
好了,这是咱们当前呢给大家演示的生成器函数的第一个实例,把它保存一下。
我来说两句