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 等;当有一个宏任务队列执行完毕后,会执行微任务队列中的全部内容,然后执行另一个宏任务,如此反复;

  • 相关阅读:
    gulp
    php
    自定义指令
    angular
    nullnullAndroid开发:TextView换行
    包用于Intel MIC性能测试程序
    卡系统Intel MIC开发环境安装
    苹果运营商中移动苹果互盼“在一起” 最快Q3推4G移动版iPhone
    位置高度ios 开发中跟绘图相关的CGFloat,CGPoint,CGSize,CGRect,CGRectZero
    程序编程Intel MIC学习资料
  • 原文地址:https://www.cnblogs.com/mufc/p/11445550.html
Copyright © 2011-2022 走看看