欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javascript异步和单线程

程序员文章站 2022-05-18 11:18:33
...

什么是异步?

先举个例子:

console.log(100)
setTimeout(() => {
    console.log(200)
}, 1000)
console.log(300)

上面的结果很容易看出,打印的顺序是100 300 200

从上面的例子可以看出,异步是不会阻塞进程的,而同步会阻塞进程,这也是同步和异步的区别。js中同步的典型例子为alert方法,他会阻塞进程,只有当打印后才会继续向下运行。

console.log(100)
alert(200)
console.log(300)

只有当alert方法弹出的对话框被点击确认,才会输出300

什么情况下需要异步?

有可能发生等待的情况,等待过程中不能阻塞其他程序的运行:
定时任务: setTimeout, setInterval
网页请求: ajax、动态< img >加载
事件绑定: addEventListener

什么是单线程

javascript在同一时间只能执行一个任务。javascript是单线程的,所以需要异步。
每一时刻最多会有一个任务处于执行状态下,其他任务处于就绪态或阻塞态(这里的阻塞态是指该任务没有获取到满足执行的资源,但是并不会阻塞其他任务的执行),一旦资源满足,则任务进入就绪队列,对于如何进入就绪队列,不同的浏览器有不同的调度算法。例如一个计时器setTimeout,当该计时器执行时,并不会立即执行内部的回调函数,而是先把它放在一边,等待计时的时间到达。当时间到达时,即回调函数调用的条件满足,浏览器会把执行函数的任务根据调度算法加入就绪队列,直到当前任务完成,再从就绪队列取出执行下一个任务。
以开始的一段代码为例,下图为异步执行过程:
javascript异步和单线程

1S时间以后,setTimeout的回调函数被调用,当前并没有执行任务,所以函数被立即执行