Damon的es6学习之路 -- 简略理解js中的异步/同步(day 3)

同步和异步的概念其实一直以来多少都有些模糊,接下来准备着手学习Generator函数,它涉及到Promise函数,而Promise又涉及到同步和异步问题,于是决定先将同步和异步的概念给撸了。

理解同步/异步问题,首先需要明确一点:

JS是单线程的头铁娃!

单线程通俗点说就是,同一时间只会做一件事情。网上很多文章称其为“流水线”,的确很贴切。
学习编程以来,一直知道,代码的读写是“由上自下”的,这就是很明显的“单线程”或“流水线”的特征。

JS主线程

似乎还有什么类似“主线栈”之类的说法,这个名字对于理解它来讲并不是重点。如果要理解同异步,我觉得最好将其理解为“线程”,我自理解为:由上自下读取代码的头铁JS,它主要运行的东西。不需要长时间的耗时,也不需要IO设备(外部输出设备,例如请求的服务器),只需要js自身就可以运行的代码,即为主线程。

JS的队列概念

因为js是单线程运行的,就好比一条只容许一辆车通过单行车道,一条条代码即是一辆辆车,车辆要通过车道,就必须排队。这也就是js的队列。例如setTimeout函数以及setInterval,其实都是异步函数,哪怕延时设置的是0,依旧会形成一个新的队列,放置在主队列之后执行。如果设置的延时大于0,则在主队列完成后N毫秒运行。

JS的同步/异步

理解了主线程和队列的概念,再去理解同步和异步其实就好理解得多。

同步:

即是排列在主线程上的代码,即是同步。

异步:

因为某些代码耗时很长,或者需要外部帮忙(IO设备,或者其他我也暂时不清楚的东西或者特殊需求),而js的单线程机制,这种长耗时代码很容易堵塞后面的代码,对于效率来说,是不太好的。你车坏了或者想下车方便一下就让后面所有车都等你,那显得太过自私,也耽搁太长时间了。所以异步就应运而生,它会将异步代码放置在主线程后,当主线程运行完毕后,才会再去运行异步的代码。相当于形成另一个队列,排列在主线程队列之后执行。(异步代码可能有多段,形成新队列的排序方式同样是自上而下的,所以js依旧是单线程的头铁娃)
主线程运行完毕后才会去执行异步队列,需要注意的是,异步队列执行的是异步方法的回调函数
异步本身的意义在于增加代码执行效率,将长耗时代码独立出来运行。它在形成一个新队列的同时,会去执行异步内的代码(例如请求),主队列执行完成后,系统会去查看异步代码是否完成,如果完成了,就会调用异步代码的回调函数,如果没完成,就会等待异步代码的完成。通常来说,异步代码的回调函数都有三种状态:未执行的成功的以及失败的
以上就是我对同步/异步的初步理解。或许会有错误或者歧义的地方,后期如果发现会回来补充说明。

猜你喜欢

转载自blog.csdn.net/qq_26332449/article/details/94721916