异步与单线程

时间:2023-01-20 18:41:50

异步与单线程

异步与单线程一直困扰了我好久,首先我们要区分的是异步是相对于什么来比较的? 同步。在理解异步时我们一定要和同步进行比较,

同步和异步的传递消息机制不一样。所谓同步就是代码被调用后,调用者需要不断的去轮询检查结果,被调用者不会告诉你结果是怎样的。异步呢?被调用者在自己执行完毕后

会告诉调用者我执行完毕,你可以来获取结果啦。所以说同步和异步是传递给调用者的消息机制不一样。需不需要调用者自己去获取是否调用完毕的产生结果这个消息。

而阻塞与非阻塞则是指,在这个执行过程中是否会等待结果的到来。由于JavaScript是单线程的,在执行时等待那么就等于后面的代码无法执行,非阻塞呢则是你执行下面的代码

需要等待去处理。你呢不理他了该干嘛干嘛直接去处理下面的代码了。

而在JavaScript里面由于是单线程。所以一般的同步时间都会阻塞后面进程,异步都是非阻塞的。执行代码是一行一行的执行。可能是因为你执行同步需要不断轮询查看结果的,你总不能执行着下面代码,还后过头去看眼结果吧?还得总去,所以干脆就把同步的设置成阻塞的了。异步的就是你需要等待?好的那你先处理去吧。我去干点别的,我干别的还没干完你告诉我你完事了?好我手头这些事做完就去处理你(队列里面的任务要等到进程中的任务完成才会被调用);如果手头没事就直接去处理啦。

所以常见的异步操作就有 定时器,动态获取图片,和DOM事件 Ajax请求

定时器setTimeout(function(){},xxx) xxx就是等待的时间单位毫秒,这个时间并不是指xxxms后定时器里面的代码会被执行。而是xxxms后定时器里面的内容会被加入到队列中

等待执行。xxxms后如果进程中没有任务就会执行,有的话就需要等待。如果xxx设置为0呢?那就是单纯的放在队列里面做队列的第一个等其余内用执行完后再去执行这段代码。

动态获取图片,img.src = "xxx.jpg";在浏览器加载图片的过程是异步加载。并且在img.src = "xxx.jpg"之前写img.onload = function(){};为确保图片加载速度过快没能执行图片加载成功后的事件。

DOM事件,所有的DOM事件都是异步的。在用户达成某一条件时才会触发。在用户达成某一条件(点击,鼠标移入等等)就会告诉调用者可以执行任务了。所以在达成某一条件后

就会执行对应的回调函数。我认为回调函数就是达成条件后回过头来调用这个函数。 

Ajax请求,也一定是异步的,在请求发出后就不在继续等待响应结果而是去继续执行下面的代码,等待服务器端返回响应数据触发回调函数,再执行回调函数中的代码。

所以JavaScript中的异步操作都不会出现堵塞现象。后面的代码会继续执行,异步的操作都在任务队列中等待进程处理完成后再执行。