美文网首页
宏任务与微任务

宏任务与微任务

作者: 春木橙云 | 来源:发表于2022-04-21 16:25 被阅读0次

宏任务与微任务相关知识点属于前端基础,掌握它对于项目优化和解决遇到的问题很有帮助,将我学习到的mark在此,以备忘了后查。

首先,先看一下下面这道题,列出输出的内容:

console.log(1);

setTimeout(() => console.log(2));

Promise.resolve().then(() => console.log(3));

Promise.resolve().then(() => setTimeout(() => console.log(4)));

Promise.resolve().then(() => console.log(5));

setTimeout(() => console.log(6));

console.log(7);

先公布答案,输出依次为:1,7,3,5,2,6,4。
要解释为什么,需要先解释清楚几个概念:

  • 常规事件流:按顺序同步执行。
  • 队列:像排队一样,先进先执行,后进后执行。
  • 宏队列:例如script加载的内容、setTimeout、setInterval等。
  • 微队列:promise的.then.catch. finally

JavaScript是单线程。当遇到异步加载时候,存在两个队列:宏队列、微队列。他们各司其职,处理对应的任务。具体顺序是,先执行常规事件流,再执行微队列,最后执行宏队列,当循环完成后,js引擎休息等待下一次循环。
好了,概念说完了,是不是很简单。下面我们回到上面那道题。我们从上到下演示一下各队列的现状。

console.log(1); //常规事件流 
// 此时,宏队列:空; 微队列:空
setTimeout(() => console.log(2)); //加入宏队列
// 此时,宏队列:[console.log(2)]; 微队列:空
Promise.resolve().then(() => console.log(3)); //加入微队列
// 此时,宏队列:[console.log(2)]; 微队列:[console.log(3)]
Promise.resolve().then(() => setTimeout(() => console.log(4))); //加入微队列
// 此时,宏队列:[console.log(2)]; 微队列:[console.log(3),setTimeout(() => console.log(4))]
Promise.resolve().then(() => console.log(5));//加入微队列
// 此时,宏队列:[console.log(2)]; 微队列:[console.log(3),setTimeout(() => console.log(4)),console.log(5)]
setTimeout(() => console.log(6));//加入宏队列
// 此时,宏队列:[console.log(2),console.log(6)]; 微队列:[console.log(3),setTimeout(() => console.log(4)),console.log(5)]
console.log(7); //常规事件流
  • 1,7是常规事件流,直接输出。
  • 接下来开始执行微队列。因为setTimeout是宏任务,继续添加到宏队列中,此时, 宏队列:[console.log(2),console.log(6),console.log(4)]; 微队列:[console.log(3),console.log(5)],则微任务队列中依次输出3,5。
  • 宏队列依次输出2,6,4。

吐槽一句:本来很简单的道理,很简单就能解释清楚的问题,有些网友的解释真的是极度的复杂啊,害得我浪费了好多脑细胞。。。还有些抄来抄去的结论根本不对,误导啊。。。

THE END

相关文章

  • 浏览器的事件机制-Eventloop

    循环机制前,我们先要会区分:宏任务与微任务 宏任务Task与微任务Microtask JS中的宏任务和微任务的区别...

  • 宏任务与微任务

    规则 Js解析Function(整个script视为global Function)时,将同步任务排队到执行栈中,...

  • 宏任务与微任务

    宏任务:setTimeout和setInterval,Ajax,DOM事件微任务:Promise,async/aw...

  • 宏任务与微任务

    前言 ·什么是宏观任务,什么是微观任务? 宏任务:宿主(浏览器)发起的任务我们可以称之为宏观任务(macrotas...

  • 微任务与宏任务

    微任务(microtask)与宏任务(macrotask / task queue) 表示异步任务的两种分类 ht...

  • 宏任务与微任务

    宏任务与微任务相关知识点属于前端基础,掌握它对于项目优化和解决遇到的问题很有帮助,将我学习到的mark在此,以备忘...

  • 理解宏任务与微任务

    宏任务(macrotask )和微任务(microtask ) macrotask 和 microtask 表示异...

  • 宏任务与微任务理解

    前言 我们常常遇到这样的问题:在有setTimeout以及Promise等异步操作的情况下,执行顺序应该是什么样的...

  • eventLoop 宏任务与微任务

    最近一直准备面试,所以在过架构相关的基础知识(会涉及较多底层),会把很多基础知识都写出来,不过没办法什么都写,主要...

  • 宏任务、微任务

网友评论

      本文标题:宏任务与微任务

      本文链接:https://www.haomeiwen.com/subject/zvoiertx.html