我在写完Promise、async、await之后我发现,有一个“绕”点,异步和同步分不清。所以我单独写一篇文章,来讲讲我对js的异步同步的理解。
看看官方图解
日常生活
这个问题我问了我同学:你对异步同步的理解。
同学A说: 统一步伐是同步。声音和画面是同步。
同学B说: 你知道我不吃姜,并且告诉其他人是同步。
同学C说: 先做语文作业,然后做数学作业,再做英语作业,是异步。如果你有三个分身,同时开始,一人做一项作业,是同步。
同学D说: 我给你个动作,你及时做出回复,那应该算同步。
同学E说: 坐车的时候车带着你走,是同步。
我例举了5个例子,你们是怎么看的呢?欢迎留言评论。
对同学们的回答分析
(先记住JavaScript是单线程,浏览器一些耗时任务开辟了另外的线程,一定不能认为js是多线程)
对于A同学说的:
统一步伐:我相信都认为是同步的,大家整整齐齐。但从js的角度来说,是异步的,因为你伸左脚不影响我伸左脚,你一步80cm不影响我一步80.000000000000001cm。再这么想,121121的口号是js的主线程,每个人看成子线程,所以每个人做出的反应时间是不确定,虽然肉眼看的整整齐齐,当还是有细微差别,逃不出js的法眼。
声音和画面:声音和画面不同一,我相信很多人都不会再看这个视频了,再看下去手机都要砸掉。如果用js的眼观看,点击播放后,请求了画面的同时请求了声音,但画面和声音两个子线程的反应时间不同。
对于B同学说的:
js表示,奴子可教也。在一个线程里先知道某人不吃姜,然后告诉别人某人不吃姜,很符合js同步。
对于C同学说的:
其实这位c同学就是我自己,在讲Promise这篇文章的时候,我就是这么理解的,后来发现我理解反了,所以写下了这篇文章,专门讨论一下js的异步同步。先后做作业我想着是在不同时间做不同作业,而三分身是在同时间做作业是同步。然后我又想了想,从某一时间出发,三分身做的是不同的作业,相当于一个主线程分成三个子线程,这不是异步了嘛。而先后做作业就符合js单线程,符合同步定义。
我解释了三个例子,剩下两个应该需要有自己的思考了,D同学是对的,E同学是错的。
程序里
异步的概念
异步就是从主线程发射一个子线程来完成任务。
一个异步过程的执行将不再与原有的序列有顺序关系。
异步不按照代码顺序执行,异步的执行效率更高。
同步的概念
单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。
同步按你的代码顺序执行。当一个事件没有结束时,不继续执行后续事件。