00:00
那接下来呢,我们就来看所谓的同步与异步模式的同步模式,什么叫同步模式呢?同步模式啊,就是我们刚刚在最开始看到的就是代码会一次的往下去执行,那后面的任务呢,是需要等待前面任务执行结束后才会去执行的,同步并不是同时执行啊,而是排队执行,先来看一下代码,在这个代码当中呢,啊,也是非常简单的一个逻辑,前面我先打印,那后面呢有一个函数,那再下来呢,又来又有另外一个函数,那再往下呢,就是一个函数的调用,那最后呢,打印一个格萝卜,嗯,那这个代码是如何去执行的呢?我们看一下它实际呢执行的流程啊,是这个样子的。来注意这个动画做了很久啊,非常的珍贵。
01:01
啊好,那怎么去执行呢?我们来看一看,首先啊,我们的代码执行是要将全部的代码呢,放入到我们的调工站当中的,那这里呢,会成生成一个匿名的调用站,那匿名调用站在执行的过程中呢,加入这些代码就开执行完成这些代码,阅读完这些代码就开始从第一行往下去执行,那第一行在执行的过程中呢,就会出现有一个叫做压战的过程,那么此时呢,我们就能看到,看到在全局的这个电路站站当中呢,就能看到这样的一句代码,那么在电路站当中去执行我们这个代码,那么这就是我们的代码执行过程,一旦执行结束之后,那我们的控制台呢,也就能够看到我们的打印结果了,也就是这个代码的执行运行的结果,那一旦这个代码执行完成之后,那就会有一个出战的动作,好,那么这是第一行代码就执行完了,那到下面这行代码的时候呢,请注意啊,我们都知道一个。
02:01
函数它如果没有调用光这里失明了,它是不会执行的,所以当我们的代码跑到下面这个函数B这里的时候呢,请注意啊,它是不会入站的,为什么呢?因为你没有调用啊,它就不执行,那么再往下也是一样,For函数也不会执行,那么因此呢也不会入站,那再往下诶,此时你会发现有一个什么函数调用了,那此时这个函数调用呢?请注意啊,函数调用本身也会入站,他入战之后,他就去说我要去执行for这个函数了,那for函数在哪呢?里边有什么呢?好,那此时呢,我就开始去我的整个的运行环境里面找到这个for函数,找到里面的代码,开始去执行,那在执行的过程中,里面也是一行一行的代码呀,所以此时依然会有一个什么叫入站的过程,然后执行我们这个代码叫cons log for。
03:01
那它执行结束之后呢,同样的会在我们的控制台有一个打印并且出站,但是不要忘记后面还有一个什么for函数里面啊,你看代码还有一个叫bar这个函数的调用,那么此时这个函数调用本身也会入站,那入站之后呢,诶,他又发现是一个什么叫函数调用,那根据我们整个的GS的业务逻辑的,这这个GS的语法规则我们能够知道是如果当前这个运行环境当中没有这个函数或者没有这个变量,那么由于我们的什么叫作用域的问题,它会跑到外面再去查找相对应的变量或者是函数,那for函数里面肯定是没有B法这个函数声明的,那因此呢,它就会跑到外面找到这个bar,那找到这个函数之后呢,执行里面的代码,依然会有一个什么入站的动作呢,就是cons log bus task那一样的,在我们的控制台。
04:01
打印出来,然后再去怎么样出战,那么整个的这个函数就执行结束了,那执行结束之后,你不要忘了,刚刚你这个把函数在for里面调用时,是不是也入战了,好,它执行完了之后回来,那么就怎么样哎,做一次出战,而此时你也不要忘记我们这个for函数依然在我们的电流站当中啊,那么因此呢,把这个函数执行结束之后,那for函数也就意味着整个执行结束了,那么再回到我们的电容战当中,那for函数也就出战啊,那再最后呢,就会执行我们最后一句代码,这就是conso global卜end,那么此时你会发现我们整个的调用过程实际上就是按照我们那个语法规则来进行一步一步的去执行的啊,那代码呢,就是这样的一个执行规则,你前面的代码没有执行结束,后面的代。
05:01
是不会执行的,而此时整个的电站只要有函数还没有执行,那么整个电工站就会一直存在好,那么这就是我们整个同步代码的一个执行过程。那再接下来我们来看异步代码的执行过程,那这里呢,也同样,我写了一段简单的代码,简单读一下这个代码前面呢,依然是打印一个格global in的后面,哎,不一样了,我不再使用函数了,而且使用set out,那再往下依然有一个set out,但是请注意啊,这个set out里面,诶,它又有怎么样一个set out,那么也就是说呢,这个set里面啊有一个,也就说是一个什么S嵌套了,好,那再往下你才能够看到有个log global in的,那么这个代码的执行流程是怎么样的呢?我们继续往下看,那同样的道理,我呢使用动画的形式来去给大家去展示,那么这个动画呢,比刚刚啊要复杂一些,我划分了不同的区域,那因此呢,我们先来解释一下,这些区域都是。
06:14
做什么的?首先第一个我们能看到controlo log,那这个呢,其实就是我们的控台啊,这边是我们的展示代码,再往下呢,就是我们的定用站了,好,那么在电容站的过程中呢,诶,你会发现这里还多了一个叫什么叫VAPS,那它是做什么的呢?哎,请注意也很简单啊,就是我们在执行代码的这个过程中啊,我会去调用一些不属于Java的语言本身的内容,就是一些API,叭方说浏览器给我提供的,然后就运行环境提供的这些API,那么这些内容在电用时呢,诶,我就通过啊这个框框来去做展示,那么下面有一个什么呢?哎,注意啊,这个单词呢,翻译过来叫队列啊,队列呢实就是排队的意思,对吧?好,一会我们来看看它到底有什么用,那再往下还有呢,叫做look啊,这是一个标志性的什么这个状态标识,那一会呢也会有作用,OK,那么有了这些内容之后啊,明白了,我们每一个区域都。
07:14
代表了什么含义啊,然后我们再来看一看这个代码的执行流程是怎样的,那往下去执行还是和刚才一样,全部的代码呢,都会做一个什么入站啊,就是一个匿密的调用站,把代码呢全部都读取完加载进去,那加载进去之后,那代码默认情况下肯定还是从上往下一次去执行的,不注意啊,当它没有遇到异步代码的时候,它的执行其实和同步代码没有任何区别,那继续往下我们来看,就首先执行第一行代码,那就是console log格global begin对吧?好,那这个呢,和我们的同步是一样的,就开始执行啊入战是吧?打印啊执行打印对吧,出战,那么在执行下面这个set out的时候,你会发现啊,有个TIMER1啊,执行的这个函数多长时间呢?是1800毫秒钟的时间,那此时这个代码请注意settime out这个函数。
08:14
本身我们说了函数的调用也是要入战的,所以呢,Set out就入账了,但是这个set out一旦去执行,它意味着什么呢?说啊,我要等一百一千八百毫秒之后才会去调用TIMER1这个函数,那么因此啊,Set set out这个函数调用本身实际上已经结束了,那你说哎,那TIME1什么时候执行呢?是1800毫秒之后对不对?好,那谁来等呢?谁来去看着它呢?诶,请注意此时你的API里面就有一个什么时间的等待了,但请注意啊,Setup after本身这个函数的调用时际上就已经结束了,所以它会出战,而后面就有一个另外的人啊,来等着,来给你去计时,注意这个时候实际就是异不产生了,那么再往下执行你。
09:14
请注意,为什么要往下执行呢?你说这有等着的呀,你不要等着它执行完吗?不是的,所谓的义步是什么?就是我当前set这个函数调用结束了,我出战了,我没事了,好了,我的代码主线程的代码依然继续往下执行,你等是吧,你等你的是另外一个线程来去做,那因此我们的代码继续往下执行,发现有个什么叫set out,又是一个啊,里面传的谁呢?是set out2,那么最后呢,是一秒钟之后执行,其实和刚才是一样的,整个的这个set,最外层的这个set啊,也是要进行入战啊,发现诶啊有一个1000毫秒啊执行谁呢?执行这个TIME2,对不对,好,没关系,那就执行就完了,那么此时啊,就相当于是我把这个任务交给了你的外围API啊,交给了你的另外一个线程,你就等一秒钟,你就执行这个函数就可以了,那我本身也就set out,这个我本身已经执行完了,那么继续往下走,他就出站,然后呢,再去执行谁啊log。
10:14
那此时你会发现啊,就setout已经执行完了,第一个第二个set呢也已经执行完了,但是里面的这个TIMER1和TIME2实际上并没有执行,是为什么呢?是因为我set time这个代码执行结束之后,是只告诉了外围片说我有一个1.8秒以后啊,你要去给我执行的一个弹板一啊,一秒钟之后啊,你要去给我执行一个弹板二,然后我就不管了啊,再往下执行卡lo好了,那一样的如战,然后呢,打印啊,就格global in,然后出战好,此时你会发现一个问题,什么?就是好像这些代码应该怎么样,都已经执行结束了,那执行结束之后,诶,不对呀,你的web APS里面不还有人在等吗?等什么呀,等这个时间一点点的流逝,对不对啊,流逝多长时间呢?流逝这个1800毫秒,流逝一千米啊,这个这个一一千毫秒。
11:14
啊,那但是整个巅峰战结束了,你说我整个的这个巅峰战要不要清空呢?啊,注意啊,要清空啊,那么一旦清空完了之后,你不要忘了,你等了1.8秒之后,你的这个内容啊,不是直接去到你的电容站去执行的,而是干嘛呢?而是先进入到哪里你的消息队列当中,请注意啊,这是额外线程里面说时间到了,或者说我回来数据了啊,一部我的一部的任务结束了,那我要回来,回到哪呢?回到你的电峰战当中,那为什么要回到电峰战当中呢?啊,请注意啊,你的异步的代码一定是等待你前面主线上的代码结束之后,我再从电容站里面取出,哎,还有没有事儿了,来过来我帮你去完成啊,是这个意思,所以呢,我无论你是比我执行的快,还是比我主线程执行的慢,那么请注意。
12:14
只要是异步的,它一定是先进入到学习队列啊,那么过来之后,哎,整个的都进来了,那么你说行习队列里面的这个内容啊,这个代码我什么时候去执行呢?好,当你的整个的这个电容站里面清空了,那么这个所谓的inter loop它就会去哪里呢?你整个的这个消息队列里面去检查一次啊,有没有任务呀,我去帮你执行啊好,一转圈诶,发现有一个什么TIME2是吧,好,可以来加入到那里,加入到我的电入战里面啊,那TIME2开始去入战了,对吧?哎,注意是这个时间点入战的,那么一旦入战之后,那就开始执行呗,啊找谁呀,找我的TIME2里面的内容啊,Conso log,那conso log在干嘛?入战,然后再去打印,然后再去出战,然后再往下执行,发现又有一个什么没错,Set啊,那请注意啊,里面的这个set是建立在你这个TIME2这。
13:14
啊,电工站这个调用时的出现的,所以他依然要进行如站,然后执行,那么此时他又是个定时78,又是一秒钟,哎,你再进去啊等但是塞塔玛奥特这个本身的代码已经执行完了,就出战,那他一出战好了,那么也就意味着你整个的这个TIMER2这个函数也就运行结束了,那么TIME2在调工战里面也就怎么样被清空,那此时你的雕用战全部又清空了,那回到哪里去?哎,没错,又回到你的,因为他漏这里说我看看队列里面还有没有要执行的东西啊好一发现一转圈,诶发现,嗯,有一个TIME1好执行啊入战,那再找到谁啊,TIME1执行啊,入战打印出战,好,整个执行结束,那TIME1结束啊,那么此时你的巅峰战又结束了,哎,又结束了,又结束之后呢,诶,注意我这里又转圈看到了吗?再一转圈发现,嗯,队列里面什么。
14:14
没有数据啊,为啥,因为这个时间可能还没到呢,对不对,他还没入这个这个呃,到我们的消费队列里面呢,对吧?啊没关系啊,再等等么,等一会儿啊,我知道里面肯定还有东西啊,所以说呢,我再去这个什么转圈发现嗯,有一个inner对吧?好,那inner再入站,那inner入站之后呢,再执行啊执行之后呢,再去打印,打印之后呢,啊,这个出战,然后整个inner执行结束,哎结束,OK,那么这就是我们所谓的整个异步的执行流程,就这个样子的。
我来说两句