lhlGitHub / trisome

前端大厂进攻学习资料库
21 stars 1 forks source link

什么是 Eventloop ? #3

Open lhlGitHub opened 2 years ago

yanggengzhen123 commented 2 years ago

Day3 Eventloop 即事件循环机制,是指浏览器或node的一种解决js单线程运行时不会阻塞的一种机制 常见的宏任务有:script脚本代码、setTimeout、setInterval、I/O等 常见的微任务有:Promise、process.nextTick(node) 下面以浏览器的事件循环为例: js中有一个主线程和调用栈,所有的任务都会被放到调用栈等主线程执行 执行栈在执行完同步任务后,查看执行栈是否为空,如果执行栈为空,就会去检查微任务(microTask)队列是否为空,如果为空的话,就执行Task(宏任务),否则就一次性执行完所有微任务。 每次单个宏任务执行完毕后,检查微任务(microTask)队列是否为空,如果不为空的话,会按照先入先出的规则(即任务队列)全部执行完微任务(microTask)后,设置微任务(microTask)队列为null,然后再执行宏任务,如此循环。

zhanglongLee commented 2 years ago

事件循环(Event Loop)

JS是一门单线程的非阻塞的脚本语言,主要执行环境是浏览器。后来H5出现Web Worker的多线程,但是新线程都完全受主线程控制,不能独立执行。

非阻塞的特点主要是因为Event Loop(事件循环)。

代码自上而下执行,代码在执行时会被压入执行栈(stack)中,当遇到异步任务(DOM的点击事件、Ajax请求、setTimeOut函数)时,会交给Web API来维护,当异步任务执行完会将对应的回调函数推入事件队列(Event Queue)中,当执行栈中任务全部执行完,浏览器会读取任务队列,并将回调函数压入执行栈中,然后循环执行。这就是事件循环(Event Loop)。

异步任务类型

不同类型的任务会进入对应的Event Queue,比如setTimeoutsetInterval会进入宏任务Event Queue。

循环流程

进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。

lianxuejie commented 2 years ago

Eventloop(事件循环机制) js是单线程语言,但在js运行过程中存在着同步任务和异步任务,Eventloop为了使js运行不拥塞。 js引擎在运行js的过程中,遇到异步任务,就交给事件处理线程(Web APIs)。由事件处理线程根据其性质不同放入不同的任务队列中。 js任务分为 Macro Task(宏任务)Micro Task(微任务); macrotask包括:script(整体代码片段)、setTimeout、setInterval、I/O、UI交互、setImmediate(Node.js环境) microtask包括:Promise.resolve().then、MutaionObserver、process.nextTick(Node.js环境)

当主线程运行完一个宏任务,会执行微任务队列中的任务,直至微任务队列为空;再去访问宏任务队列继续执行下一个宏任务,直至两个队列都为空。

参考