浅谈宏任务、微任务(附带面试题)

本文详细讲解了Node.js中的事件循环机制,包括宏任务(如setTimeout、setInterval)与微任务(如Promise.then)的执行流程,并通过实例分析了代码执行顺序。重点讨论了宏任务等待微任务完成的特性,以及两个面试题目实例演示。
摘要由CSDN通过智能技术生成
今天在学node的时候有讲到浏览器中事件循环,大概整体流程也就是如下图

在这里插入图片描述
需要明确此几个概念
1.首选整个的事件的循环叫做一个tick,就是上图中整个的一个流程,从js脚本到宏任务、微任务队列再到栈。
2.事件循环中的共有两种任务,一个是上图中的TaskQueue宏任务,另外一个则是MicroataskQueue微任务。
3.常见的微任务队列的任务有:promise.then(),process.nextTick等任务
4.常见的宏任务队列则有:setTimeOut()、setInteval()等任务
5.宏任务想要执行的话必须要等微任务 *全部* 执行完毕后再能执行

接下来不多BB直接上面试题
面试题一
setTimeout(()=>{
    console.log("1")
    Promise.resolve().then(()=>{
        console.log("2")
    })
})
console.log("3")
Promise.resolve().then(()=>{
    console.log("4")
    setTimeout(()=>{
        console.log("5")
    })
})

分析一下上面的代码
第一个执行的是setTimeout,setTimeOut是一个宏任务,所以会先放到宏任务队列(注意:现在还不会执行,因为js脚本代码还没有执行完)
第二个执行的是console.log(“3”) //此时会直接输出3
第三个执行的是promise.resolve(),此时的then是一个微任务,所以会放到微任务队列(此时也不会执行)

js脚本代码代码执行完毕后就会先执行微任务队列中的任务

第四个执行的是微任务队列中的console.log(“4”)//此时会直接输出4
但此函数还没有执行完,后面还接了一个定时器函数,又因为此函数是一个宏任务,所以也会放到宏任务队列中去(此任务排在第二个执行)

此时微任务队列已经没有任务了,则会开始执行宏任务队列

首先执行的就是上面的setTimeout(),会直接输出 1
后面接了一个promise.then,这个函数就被放到了微任务队列中,因为微任务队列中有任务了就会先执行微任务队列,那么就会输出2

最后执行宏任务队列的定时器,则输出 5
因此最后输出的结果为 3 4 1 2 5
在这里插入图片描述

最后放两道面试题留给大家思考思考
面试题二
setTimeout(function () {
  console.log("set1");
  new Promise(function (resolve) {
    resolve();
  }).then(function () {
    new Promise(function (resolve) {
      resolve();
    }).then(function () {
      console.log("then4");
    });
    console.log("then2");
  });
});

new Promise(function (resolve) {
  console.log("pr1");
  resolve();
}).then(function () {
  console.log("then1");
});

setTimeout(function () {
  console.log("set2");
});

console.log(2);

queueMicrotask(() => {
  console.log("queueMicrotask1")
});

new Promise(function (resolve) {
  resolve();
}).then(function () {
  console.log("then3");
});
// pr1
// 2
// then1
// queuemicrotask1
// then3
// set1
// then2
// then4
// set2
面试题3
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
// aysnc1 end
// promise2
// setToueout
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是一个宏任务微任务相关的面试题。 1. 什么是宏任务微任务? 答:宏任务微任务JavaScript 引擎用来管理异步任务的两种机制。 宏任务指的是在 JavaScript 引擎中排队等待执行的任务,这些任务通常是由浏览器或 Node.js 等宿主环境提供的,如定时器、事件回调等。 微任务指的是在当前任务执行完毕后需要立即执行的任务,这些任务通常是由 Promise 和 MutaionObserver 提供的,如 Promise.then()、Promise.catch()、Promise.finally() 和 MutationObserver。 2. 宏任务微任务的执行顺序是怎样的? 答:宏任务微任务执行顺序是不同的,它们都有自己的队列,而且微任务的优先级比宏任务高。 当一个宏任务被执行时,会先执行完所有的微任务,然后再继续执行下一个宏任务。如果在执行微任务的过程中产生了新的微任务,那么这些新的微任务会被插入到当前微任务队列的末尾,等待下一次执行。 举个例子:假设当前有一个宏任务 A,它包含三个微任务 X、Y 和 Z。当宏任务 A 被执行时,会先执行微任务 X,然后执行微任务 Y,最后执行微任务 Z,如果在执行微任务 Y 的过程中又产生了一个新的微任务 W,那么它会被插入到当前微任务队列的末尾,等待下一次执行。 3. 如何利用宏任务微任务实现异步操作? 答:可以使用 Promise 和 async/await 来利用宏任务微任务实现异步操作。 例如,使用 Promise 来发起一个异步请求: ```javascript function fetchData() { return fetch('https://api.example.com/data') .then(response => response.json()) .then(data => { console.log('data:', data); }) .catch(error => { console.error('error:', error); }); } ``` 在这个例子中,fetchData 函数返回一个 Promise 对象,当这个 Promise 对象被 resolve 时,会执行一系列的微任务,包括打印数据到控制台。如果发生错误,会执行一个 catch 微任务。 另外,可以使用 async/await 来简化异步操作: ```javascript async function fetchData() { try { const response = await fetch('https://api.example.com/data'); const data = await response.json(); console.log('data:', data); } catch (error) { console.error('error:', error); } } ``` 这个例子中,使用 async/await 来编写异步代码,fetchData 函数会等待 fetch 请求的结果,在结果返回后再执行后续操作。如果发生错误,会抛出一个异常,可以通过 try/catch 块来处理。在执行 async 函数时,会创建一个微任务队列来管理异步操作,确保异步操作的执行顺序正确。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值