前段时间在前端岗位上实现请求后端接口时,JS中同步和异步这两个概念总困扰着我:究竟异步是什么呢?和同步有什么区别呢?通过细读几篇大佬的讲解后,终于明白了这两者的概念,今天就浅谈下我个人对同步和异步原理的理解。
一、单线程语言
在了解同步和异步之前,我们得先理解一些基本概念。首先,JavaScript是一门单线程的语言,意思就是,同一个时间只能执行一个任务。JS作为一种浏览器脚本语言,主要用处是与用户互动和操作DOM,产生的交互方式是单向且线性的。假设JS有两个线程同时运行,如果一个线程编辑了DOM,而另一个线程删除了DOM,那浏览器该如何执行呢?所以单线程就让浏览器只听取一个线程的执行,不会产生分歧。
二、同步和异步
在单线程中,所有任务需要排队,一个任务结束后,下一个任务才会开始。这与我们理解的代码执行顺序相似:一行代码执行完毕后,下一行代码才会执行。这就是同步。
然而,在主线程排队的所有任务中,执行耗时有长有短:短的像console.log(),长的像ajax请求网络数据。那如果一个任务请求过大,把后面任务都堵死了怎么办?聪明的JS设计者发现,同步任务通常在CPU上计算,而耗时的异步任务占用在IO输入输出设备,互相不冲突。调用异步方法更像一个消息传递,一旦就会立即返回,在IO设备上挂起,主线程继续执行同步任务。