单线程

由js用途决定的, 其用途主要是与用户互动,以及操作DOM,如果不是单线程的话会带来很复杂的同步问题,
比如:如果是多线程的话,一个用户新建一个DOM,另一个用户删除同一个DOM,该如何处理将变得非常麻烦。

同步和异步

由于是单线程,所有任务需要排队,但是如果队列中所有的任务都是同步的话会造成资源的浪费。
于是任务分为两类:同步任务和异步任务。

宏任务

# 浏览器 Node
I/O
setTimeout
setInterval
setImmediate
requestAnimationFrame

微任务

# 浏览器 Node
Promise.prototype.then catch finally
process.nextTick
MutationObserver

Promise的executor是同步的哦!!!

事件循环的步骤

image.png


node如何实现IO非阻塞异步实现

我们看到的NodeJs单线程只是一个js主线程,本质上的异步操作还是由线程池完成的,node将所有的阻塞操作都交给了内部的线程池去实现,本身只负责不断的往返调度,并没有进行真正的I/O操作,从而实现异步非阻塞I/O,这便是node单线程的事件驱动的精髓了。