JS的同步与异步

102 阅读2分钟

同步行为和异步行为的对立统一是计算机科学的一个基本概念。JavaScript是一个单线程语言,采用事件轮循执行代码,所以同步和异步是其尤为重要的核心机制。

异步行为是为了优化因计算量大而时间长的操作。如果在等待其它操作完成的同时,即使运行其它指令,系统也能保持稳定,那么这样做就是务实的。

同步与异步

同步行为对应内存中顺序执行的处理器指令,每条指令都会严格按照它们出现的顺序来执行,而每条指令执行后也能立即获得存储在本地的信息,这样的执行流程容易分析程序在执行到代码任意位置时的状态。

以炒菜为例子,你要先洗菜,再切菜,最后再炒菜,一步一步的执行,这就是一个简单的同步任务

相对的,异步行为类似于系统终端,即当前进程外部的实体可以触发代码执行。异步操作经常是必要的,因为强制执行一个等待长时间的操作通常是不可行的(同步操作则必须要等)。如果代码要访问一些高延迟的资源,比如向远程服务器发送请求并等待响应,那么就会出现长时间的等待

想象一下,你在做饭,从开始蒸米饭到米饭煮好,这个过程往往需要耗费不短的时间,你还有许多菜要炒,如果你等待着米饭煮好再去炒菜,这样会十分的浪费时间且低效率,这个时候我们可以把煮米饭当做一个异步操作,在按下开关的那一刻将其放置在一边,先不管,开始炒菜(也就是执行同步任务),等待菜炒完,这个时候米饭已经好了或者快好了,就将其再次作为同步任务执行。这样效率是不是高多了。

常见的异步任务
Events
javascript各种事件的执行都是异步任务  

setTimeoutsetInterval 
定时器 特别的,如果将setTimeout()的第二个参数设为0,就表示当前代码执行完(执行栈清空)以后,
立即执行(0毫秒间隔)指定的回调函  

queueMicrotask 
执行微任务  

XMLHttpRequest
(也就是 Ajax)  

requestAnimationFrame 
类似于定时器,但是是以每一帧为单位 
  
Promise  
async function