美文网首页
微任务 宏任务

微任务 宏任务

作者: vivianXIa | 来源:发表于2021-02-19 22:18 被阅读0次
    • 微任务Microtask/Task 一次执行一个,一个执行完后检测
      当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务,可以理解为回调事件。

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


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

    Microtasks和Macrotasks是异步任务的一种类型,Microtasks的优先级要高于Macrotasks

    Microtask
    - process.nextTick
    - promise.then
    - Object.observe (废弃)
    - MutationObserver
    
    Macrotask
    - setTimeout
    - setImmediate
    - setInterval
    - I/O
    - UI 渲染
    
    • 运行机制
    1. 在执行栈中执行一个宏任务。
    2. 执行过程中遇到微任务,将微任务添加到微任务队列中。
    3. 当前宏任务执行完毕,立即执行微任务队列中的任务。
    4. 当前微任务队列中的任务执行完毕,检查渲染,GUI线程接管渲染。
    5. 渲染完毕后,js线程接管,开启下一次事件循环,执行下一次宏任务(事件队列中取)。

    PS

    event loop

    JS主线程不断的循环往复的从任务队列中读取任务,执行任务,这中运行机制称为事件循环(event loop)。

    • 注意:
      每一个 event loop 都有一个 microtask queue
      每个 event loop 会有一个或多个macrotaks queue ( 也可以称为task queue )
      一个任务 task 可以放入 macrotask queue 也可以放入 microtask queue中
      每一次event loop,会首先执行 microtask queue, 执行完成后,会提取 macrotask queue 的一个任务加入 microtask queue, 接着继续执行microtask queue,依次执行下去直至所有任务执行结束。

    相关文章

      网友评论

          本文标题:微任务 宏任务

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