00:00
好,那么genator的最基础的用法我们讲解完成之后呢,接着我们来看一下如何对我们的异步操作进行一个修改,那么前面呢,我们使用了promise的方式,点Z,然后呢,也使用了a think of it的方式,那接着我们再一次的去复制一个代码出来,好,这里呢,我们再复制一份,然后呢,我们去给它做一个修改,那依然叫做index,然后这里呢,我们给它加一个整戒烟,那如何对它做这个更改呢?还是去点击这个send之后我们来去做这个封装,那这里呢,我们就暂时啊,先不要啊,先不用去管它,那接着呢,我们做这样的一件事情,我们先对我们要做的事情进行一个整东西的封装,那之前呢,其实我们都是去调用玛雅。
01:01
Jack去发送请求的,那当异步执行时呢,我们需要暂停等待,那因此呢,我们这里就可以去这样写,那剩剩一个function,那function呢,我们就加一个星号,然后呢,再使用这个f fun吧,好放入里面,那每一次的停止呢,我都需要一个页,然后页子的结果调用呢,其实就是一个叫做MY这样的一个内容,好同样的这个效果呢,我需要在这里呢,把我之前啊使用的这个地址呢,也给它一样的拿过来,好回到我们的代码当中,我们直接呢在页的后面把这个内容呢给它写上,那么写上之后呢,我就知道啊,需要在这里呢,来一个暂停了,那么再往下呢,其实还有叭方说呢,我们来一个宋词,好,那这就是两个,那一定是从前往后的,因为叶呢,它是会暂停的,那。
02:01
然后去使用呢,也是非常简单的,我们直接呢,使用一个VRF等于这个f fun的调用,拿到这个便利器对象,那通过便利器对象来去调用这个next的方法来去具体的执行,那一旦执行呢,其实第一个这个8080呢就发送成功了,那发送成功之后呢,我们知道最终的结果呢,给我们返回的是一个对象,对象里面有两个值,一个是value,一个是当,所以现在呢,我们还是需要拿到这个结果了,比如说呢,我们就要记一等于,然后紧接着我们就consoularlo去打印这个第一来去看一下最终给我们返回的结果是什么,那么一样的,我们打开我们的浏览器来去查看,好这里呢,还是通过检查的方式找到我们的console这里呢,我们去点击,那么现在呢?我们能够发现这个send not found是没有的,那就证明我们这里写的是不对的。
03:01
啊,OK,那我们啊直接呢,把它改成这个f fun就可以了,但这个没有写完啊,不过没关系,我们来看看,好,我们再一次的去刷新,然后去点击,那现在呢,我们能够看到的是value,一个promise,然后down呢,是false,就意味着后面还有没有执行的代码,那value的值呢,是一个promise呢,其实也就简单了,那同时我们也能够看到它的状态呢,是fulfilled,那最终的结果呢,也其实已经拿过来了,那请注意它的结果是一个,就是value只是一个promise,那我们想要拿到这个结果呢,其实还是要回到promise那里呢,啊去做,那怎么去做呢?啊也是非常简单的,我们直接使用第一第2VALUE拿到的是promise呢,我们就可以使用点的方式来继续使用了,那和之前使用promise.z呢,没有任何的区别,那我们这里直接使用点啊这个date的方式来进行一个conso.log去打印这个date,好我们保存一下。
04:01
那现在看起来呢,你可能会有一个比较大的疑惑,就说那我使用这个genator和我使用这个promise到底有什么区别啊,那么此时呢,你也能够看到,诶这里呢,其实就直接去执行了,那那它到底有什么区别呢?那还不是增加了这个啊,那看起来还比这个原生的这个这个promise的方式呢,增加了复杂度,那为什么会出现这种情况呢?实际上也是非常简单的,因为你现在所执行的这个代码,我们自己做的这个封装是让我们再去发送这个地址请求时呢,确实没有去使用这个方式了,那最终我们写的这些代码呢,实际上是封装好一次就可以不动的这种情况,那这种情况应该应该怎么去做呢?那现在我们知道能够发送这个8001了,但是宋词这个请求呢,依然是没。
05:01
就发出去的,那想要发出去的呢,我们就得在这里再一次的去使用这个F,然后呢,点上这个next的方法,那拿到这个方法之后呢,其实我们依然可以在这里使用这个VR第一,然后后面呢,还是使用这个第一的方式去用它的点value,然后去调用它的这个结果,那因为返回的依然是一个promise嘛,因此我们还是可以使用点Z,那么最终啊就是date,然后呢,我们依然可以consult.log去打印这个date,那么这是执行了两次的这个结果,我们来看一看能不能行,好,我们刷新一下,你来看早日富可敌国啊,什么流不进许多愁,那不管是向8001的主要端口发送请求,还是向宋词这个端口去发送请求,那我们都都能够拿到相对应的结果。
06:01
或值,但是有一个最大的问题在于,如果我这里再写一个,那么你这个地方是不是也要再写一次,那它就会出现什么情况呢?就是不断的重复写两个地方,而我们在当前从21号到26行这个代码中呢,其实你也能够看得到,其实完全没有必要。为什么这么说呢?因为你每一次调用的结果或者执行的代码其实都是一模一样的,就是通过next的调用,然后调用点value.z然后log去打印就可以了,当这里的处理的方式是打印,那我们还可以去返回或者调用下一次next的方式呢,来去返回到我们这里来去接收一下,那所以我们就可以对这个封装进行一个代码函数的啊封装。
07:01
那这个应该怎么去写呢?首先第一个呢,我们在这里去声明一个函数,这个函数呢也是非常简单的,比如呢,我就写一个function,然后给它起一个名字呢,就叫handle,好,那么在handle德里面呢,我就接收一个值叫is,那这里面呢,我就需要做这样的一件事情,因为你有多少页的调用,那我这个next以及后面的结果呢,就要执行多少次,所以呢,我就可以写一个递归,那这个递归呢,得需要有一个判断,判断你后面还有没有未执行的代码,所以此时呢,我们就可以去使用这样的方式,比如用if发纳,那I呢,就是你传进来的迭代器对象。
08:01
那么此时我就可以使用它的点当如果V5,那就证明后面没有任何的代码了,那我就直接使用return给你停住就可以了,那如果你传过来的是有内容的,所以呢我就直接使用点value的方式来去调用点Z,然后呢把date给传进去,还是使用箭头函数的方式,那这里呢,我们也不做其他的动作,要求直接呢是用点二啊打印date的方式,那如果没有return,就证明你后面还有代码,所以我就需要继续调用这个handleler,然后把什么呢,把当前的这个结果给你返回,返回的结果是什么呢?实际上就是我们这个F的点next,那么因此呢,我们这还是去调用一次f.next给你传进去那这个代码。
09:01
完了实际上就不再需要了,但是第一次调用这个handleler呢,你依然要将f.next给它传进去,好,那这样写完之后呢,我们还有一个任务是需要去做的,因为所有的这个代码呢,其实和我们当前的这个逻辑呢,是写到一起的,所以更好的方式呢,是我们将整个的这个整的封装呢,再一次的放到一个函数的封装当中,那比如这里呢,我们使用一个function来去写一个CU这样的一个函数,那函数里面呢,我们就接收一个F,然后呢,把我们的当前的这个代码,以及到handleler的调用的内容呢,全部都拿到我们当前的这个函数当中,然后格式化一下我们的代码好保存一下,之后呢,我们就直接去在后面啊调用次这个。
10:01
CU就可以了,然后呢,把我们的FU给大家传进去,那此时呢,拿到的这个结果呢,诶就可以去使用了,一旦有了它之后呢,哎,我们就不再去担心这个到底应该怎么去处理我们的这个迭代器了,那么接下来呢,我们继续来看一看到底是不是可以使用的,现在呢,我们刷新一下,诶那两个值呢,依然是有的,所以呢,你会发现就是当前我们再去使用这个内容时,我们就可以直接去调用这个Co就可以了,那Co这个模块呢,实际上是我借鉴了TG打神的这个思路,那什么意思呢?其实在我们的a think和a wait这个语法规则出来。
11:01
之前我们就已经在使用generate的生成器对象来去使用a think和a wait类似的这种语法规则来去写,或者叫实现,或者叫封装我们的业务代码了,那整用起来呢,也确实是非常麻烦的,就比如呢,我们需要自己去封装这个Co函数来去实现对JA瑞ta这个生成器的控制,那有了这个Co拈块之后呢,我们就可以直接把这个JA瑞ta的封装来交给我们的Co拈,就意味着我们这里呢,直接去写这个生成器函数就可以了,那到底是如何执行,如何暂停,那什么时候执行完,那这里呢都不需要我们去管,那你的异步什么时候回结果全部通过这个COO拈来去调度,那因为我这里呢,可能网络不是特别好,那大家如果感兴趣的话呢,啊,就可以去get up上啊,找到TGZ这个模块,可以去研究一下,那这。
12:01
也就是我们使用的这种方式,那么一旦我们封装好了之后啊,如果这个COO的拈你不去管它,那么再一次的回到我们的这个生成器对象这里来,你会发现我们再使用的这样的方式,然后呢,我们就可以去复制出来一份,把这个新号呢给它删掉,然后前面就可以使用什么呢?叫做这个a think好,那么每一次把这个什么呢?把这个Y换成a wait就可以了。为什么把a think a it叫做语法糖呢?实际上就是不需要自己封装的生成器函数,在语法规则上已经把生成器对象,也就是我们封装好的这个Co的函数,或者叫方法全部都给我们封装好的,那就叫a think和a it。为什么说它是语。
13:01
糖呢?因为a think of it的本质依然使用的是生成器函数,所以讲清楚这一点之后,你可以再回到那个面试题上,然后呢,再来仔细的去想一想到底是怎么回事。
我来说两句