JavaScript异步(必考三座大三之三) —— 第一集:概念

看了题目,很多同学应该有感人三问:异步是神马?同步是神马?为什么不用同步非要用异步?

 官方给出来的概念是这样的:异步,就是双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。

看了是不是更蒙?不着急,我们先看看一组代码:

console.log(1);
setTimeout(()=>{
    console.log(2);
},1000)
console.log(3);
setTimeout(()=>{
    console.log(4);
},2000)
console.log(5);

按照正常人的思维,控制台执行的顺序应该是:1,2,3,4,5,但实际执行的顺序却不是这样的。

 实际执行的顺序如图:1,3,5,一秒后出现2,两秒后出现4。

我们来唠一下这个执行结果,控制台打印出来的1,3,5这三条语句,其实就是同步语句,网页一刷新它就立刻出来了,控制台打印出来的2,4这两条语句,经过1秒、2秒后出现的语句,就是异步语句。

所以,简单来说,在计算机的执行机制里面,有两种任务:

同步任务:在主线程上排队执行的任务,只有在前一个任务执行完了,才能执行后一个任务。

异步任务:在任务队列中排队,等待主线程的任务执行完毕以后才开始执行。

现在就开始引出问题三了,为什么不用同步非要用异步?

回答:因为JavaScript这种语言是单线程语言,只能干一件事情,就比如一个人,总不能一边说话一边唱歌吧?我们不是为了异步而异步,异步的存在是有意义的,举个栗子,比如我们要进行一个网络请求,在请求的过程中可能是1秒,也可能是10秒,如果回到解放前就更慢了,那么在等待请求这段时间里,你不能滚动,不能点击,也没有动画,那一定很抓狂对不对?所以我们才需要异步操作。

//异步操作
console.log('a');
setTimeout(()=>{
     console.log('b');
},1000)
console.log('c');

我们再来看一下上图,他的执行顺序是:先打印‘a’,再开定时器,让它一秒后打印‘b’,那么在时间流逝1秒钟之前打印'c',最后才打印‘b’。那么肯定有同学要举手提问了:假如我把定时器的1秒钟改成0秒,会不会执行结果变成a,b,c呢?这个问题问得好,下次别问了,我们上面已经讲到了这个问题,上述的可以打印a,c的语句是同步任务的语句,他们是在主线程优先执行的,而定时器执行的任务则是异步任务的语句,等待主线程的任务执行完毕以后才开始执行

我们再来看看一个代码片段

// 同步操作
console.log('i');
alert('j')
console.log('k')

执行结果:

 从执行结果我们直观的看出,上述三个执行同步任务的语句,在执行第二个任务,打印弹窗的时候,浏览器就卡在那里,你必须要点击弹窗中的确定,才会打印出‘k’,所以这个就是同步任务执行的弊端。

敲黑白记笔记

异步不会阻塞代码执行

同步会阻塞代码执行

异步这玩意后面还要跟大家唠唠其他相关知识点,今天就先写到这里。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>