宏任务和微任务

55 阅读1分钟

先说几个概念

  1. JS是单线程
  2. JS运行环境:浏览器或Node
  3. 执行栈,遵循先进后出的原则。当开始执行JS代码时,首先会执行一个main函数,然后执行我们的代码。
  4. event loop中,每次循环成为tick,每一次tick任务如下
  • 执行栈选择最先进入队列的宏任务,执行同步代码直到结束
  • 检查是否存在微任务,有则执行至微任务队列为空
  • 如果宿主为浏览器,开始渲染页面
  • 开始下一轮tick,执行宏任务中的异步代码(setTimeout等回调)

-宏任务(macrotask)jobs微任务(microtask) task
发起方宿主JS引擎
具体事件1. script 2. setTimeout/setInterval 3. UI redering/UI事件 4. postMessage/MessageChannel 5. setImmediate,I/O1. Promise 2. MutaionObserver
谁先运行
会触发新一轮tick吗不会

想想他的输出顺序吧~

  console.log('start')
  setTimeout(() => {
  	console.log('setTimeout');
   }, 0);
   new Promise((resolve) => {
   	console.log('promise');
    	resolve();
   }).then(() => {
   	console.log('then1');
   }).then(() => {
   	console.log('then2');
   });
   console.log('end');