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

 

posted @ 2019-09-02 11:30  mumengchun  阅读(1283)  评论(0编辑  收藏  举报