zoukankan      html  css  js  c++  java
  • macrotask 和 microtask 的本质和理解

      浏览器的事件循环分为 macrotask 和 microtask,浏览器先从 macrotask 取出一个任务执行,再执行 microtask 内的所有任务,接着又去 macrotask 取出一个任务执行,这样一次循环。

      

      marcotask 的本质是浏览器多个线程之间通信的一个消息队列;在 chrome 里,每个页面都对应一个进程,该进程又有多个线程,比如 js 线程、渲染线程、io 线程、网络线程、定时器线程等等,这些线程之间的通信是通过向对象的任务队列中添加一个任务(postTask) 来实现的;

      浏览器的各种线程都是常驻线程,他们运行在一个 for 死循环里面,每个线程都有属于自己的若干任务队列,线程自己或者其它线程都可能通过 postTask 向这些任务队列添加任务,这些线程会不断的从自己的任务队列中取出任务执行,或者把处于睡眠状态直到设定的时间或者是有人 postTask 的时候把它唤醒;

      microtask 是确确实实存在的一个队列,microtask 是属于当前线程的,而不是其他线程 postTask 过来的任务。只是延迟执行了而已,比如 Promise.then、mutationObserve 都属于这种情况;

      宏任务队列可以有多个,微任务队列只有一个;主线程上的任务就是第一个宏任务,即刚进来时候的 script;能够建立宏任务的有: script、setTimeOut、setInterval、requestAnimationFrame 等;会建立微任务的有:promise的回调、process.nextTick 等;当有一个宏任务队列执行完毕后,会执行微任务队列中的全部内容,然后执行另一个宏任务,如此反复;

  • 相关阅读:
    关于SOA和AOP
    网络通信
    网络层ddos与应用层ddos区别
    python 模块发布及使用
    安全等级划分依据与应急响应流程
    ssl与ssh
    列表计数及插入
    博客首语
    聊聊当今市面上的国产耳机
    “互联网+”背景下使用微信公众号增强班主任工作与整合教学资源(泰微课)
  • 原文地址:https://www.cnblogs.com/mufc/p/11445550.html
Copyright © 2011-2022 走看看