美文网首页
JS事件循环机制 eventloop

JS事件循环机制 eventloop

作者: Marshall3572 | 来源:发表于2021-11-26 16:35 被阅读0次

如何理解JS事件的循环机制(浏览器端)
答:

  • 我们知道JS是单线程运行的(暂时撇去web worker)、是异步的、是基于事件执行的
  • JS主线程是同步执行的,遇到异步任务的时候,需要任务队列来辅助
  • HTML规范说,浏览器至少有一个事件循环,一个事件循环至少有一个任务队列,每个任务都有不同的分组,每个组有不同的优先级权限

在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下:

  • 执行一个宏任务(栈中没有就从事件队列中获取)
  • 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
  • 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
  • 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
  • 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)


宏任务
浏览器为了能够使得JS内部(macro)task与DOM任务能够有序的执行,会在一个(macro)task执行结束后,在下一个(macro)task 执行开始前,对页面进行重新渲染,流程如下:

(macro)task->渲染->(macro)task->...

宏任务包括

script(整体代码)
setTimeout
setInterval
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Node.js 环境)

微任务
microtask,可以理解是在当前 task 执行结束后立即执行的任务。也就是说,在当前task任务后,下一个task之前,在渲染之前。
所以它的响应速度相比setTimeout(setTimeout是task)会更快,因为无需等渲染。也就是说,在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行完毕(在渲染前)。

微任务包含

Promise.then
Object.observe
MutaionObserver
process.nextTick(Node.js 环境)
  • 事件循环过程中,先执行完主线程中的代码,然后循环去调取任务队列中的任务执行,而微任务优先级会大于宏任务,优先执行微任务,不断循环这个过程,这就是事件循环的缩略描述
    规则:同步代码->执行全部微任务->单个宏任务->全部微任务->...
    记得画图:执行栈,宏任务队列,微任务队列
    注意:1. setTimeout如果有值,则时间到了才放入宏任务; 2. new Promise((resolve, reject) => {xxx}) xxx为同步代码
 setTimeout(function f1(){
     console.log(1)

     Promise.resolve().then(function f2(){
         setTimeout(function f3(){
         console.log(3)
         })
         console.log(2)
     })
     })

     setTimeout(function f4(){
     console.log(4)

     Promise.resolve().then(function f5() {
         setTimeout(function f6() {
         console.log(5)
         })
         console.log(6)
     })
     })

Chrome

setTimeout ==》 一会(宏)
.then(fn) ==》马上(微)

new Promise(fn)中,fn是马上执行的,相当于fn()

例题: 注意:不管是否resolve,.then后边的函数都会加入执行队列。resolve还是reject只区别于执行第一个(resolve)还是第二个(reject)函数。

相关文章

  • JS事件循环机制 eventloop

    如何理解JS事件的循环机制(浏览器端)答: 我们知道JS是单线程运行的(暂时撇去web worker)、是异步的、...

  • JS中EventLoop事件循环机制

    JavaScript的事件分两种,宏任务(macro-task)和微任务(micro-task) 先记住两个概念:...

  • 事件循环机制 - EventLoop

    首先 JavaScript 是单线程,为了处理异步,I/O 等待状态等问题引入了事件循环机制。 代码由上往下顺序执...

  • 异步操作和事件循环机制(Event Loop)续一

    上一次文章 异步操作和事件循环机制(Event Loop)中我们提到了 EventLoop ,而事件循环机制在 N...

  • EventLoop 事件循环机制

    什么是EventLoop? 浏览器协调用户操作、渲染、网络请求,硬件控制等事件源执行顺序的机制. 外部队列(Tas...

  • 事件循环EventLoop机制

    1. 宏任务与微任务 依据我们多年编写 ajax 的经验:js 应该是按照语句先后顺序执行,在出现异步时,则发起异...

  • 面试题总结(一)

    1、什么是 EventLoop EventLoop是一种事件循环机制,可以用来解决javascript单线程运行不...

  • js中的事件循环机制(eventloop)

    前言  众所周知,JavaScript 是一门单线程语言,虽然在 html5 中提出了 Web-Worker ,但...

  • js 事件循环 eventLoop

    首先 js 是一个单线程 第二个 js 执行的顺序 程序 -----> 宏任务 ---> 微任务 宏任务 set...

  • js相关

    eventloop 主线程从任务队列中读取事件,这个过程是循环不断的,这种机制就是eventloop 宏队列也叫t...

网友评论

      本文标题:JS事件循环机制 eventloop

      本文链接:https://www.haomeiwen.com/subject/sqswjltx.html