什么是宏任务微任务

一. 什么是宏任务微任务?

1.宏任务(由浏览器、node发起) :setTimeout延时调用、setInterval定时调用 Ajax DOM事件、setImmediate(Node环境)、script(整体代码块)

2.微任务(由JS自身发起) :Promise async/await 、 promise.[ then/catch/finally ]、事件队列 process.nextTick(Node环境)

3.微任务比宏任务的执行时间要早

二. 提到宏任务微任务,前提要明白同步与异步是什么?

前端核心语言就是JS,所以对于JS的一些基本知识,是一定要了解清楚的。JS 是单线程执行的语言,也就是在一个时间段内只能做一件事。这就导致后面的任务需要等到前面的任务完成才能执行,如果前面的任务很耗时就会造成后面的任务一直等待。为了解决这个问题JS中出现了同步任务和异步任务

同步任务:

主线程上排队执行的任务只有前一个任务执行完毕,才能执行后一个任务,形成一个执行栈。

异步任务:

==异步任务:==不进入主线程,而是进入任务队列,当主线程中的任务执行完毕,就从任务队列中取出任务放进主线程中来进行执行 简言之->主先任务后

由于主线程不断重复的获得任务、执行任务、再获取再执行,所以者种机制被叫做事件循环(Event Loop)

三、以下举例说明:

一、主线程上宏任务、微任务执行顺序

console.log('---start---');//第一轮主线程
 
setTimeout(() => {
  console.log('setTimeout');  // 将回调代码放入个宏任务队列,第二轮宏任务执行
}, 0);
 
new Promise((resolve, reject) => {
  console.log('---Promise第一轮微任务同步执行---');//第一轮微任务同步执行
  resolve()
}).then(()=>{
  console.log('Promise.then实例成功回调执行'); // 将回调代码放入微任务队列,第一轮宏任务执行完后立即执行
});
 
console.log('---end---');//第一轮主线程结束
---start---
---Promise第一轮微任务同步执行---
---end---
Promise.then实例成功回调执行
setTimeout

so:执行顺序:主线程 >> 主线程上创建的微任务 >> 主线程上创建的宏任务 !!!!!

二、宏任务中包含微任务

 
// 宏任务队列 1
setTimeout(() => {
  // 宏任务队列 2.1
  console.log('timer_1');
  setTimeout(() => {
    // 宏任务队列 3
    console.log('timer_3')
  }, 0)
  new Promise(resolve => {
    resolve()
    console.log('new promise')
  }).then(() => {
    // 微任务队列 1
    console.log('promise then')
  })
}, 0)
 
setTimeout(() => {
  // 宏任务队列 2.2
  console.log('timer_2')
}, 0)
console.log('========== Sync queue ==========')

输出:
========== Sync queue ==========
timer_1
new promise
promise then
timer_2
timer_3

执行顺序:主线程 >> 主线程上的宏任务队列1 >> 宏任务队列1中创建的微任务

三、async

 
   async function async1() {
       console.log('async1 start');
       await async2();
       console.log('async1 end');
   }
   async function async2() {
       console.log('async2');
   }
   
   console.log('script start');
   
   setTimeout(function() {
       console.log('setTimeout');
   }, 0)
   
   async1();
   
   new Promise(function(resolve) {
       console.log('promise1');
       resolve();
   }).then(function() {
       console.log('promise2');
   });
   console.log('script end');

输出如下:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout

版权声明:本文为zyj123__原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。