js EventLoop、宏任务和微任务

2022-04-06  本文已影响0人  咸鱼不咸_123

1.javascript是单线程的语言

javascript是一门单线程执行的编程语言。也就是说,同一时间只能做一件事情。

如下:如果有多个任务要执行,执行其他任务时,其他任务都要进行等待

52.png

1.1 单线程执行任务队列的问题

如果前一个任务非常耗时,则后续的任务不得不一直等待,从而导致程序假死的问题。

2.同步任务和异步任务

为了防止某个耗时任务导致程序假死的问题,javascript把待执行的任务分为了两类。

2.1 同步任务和异步任务的执行过程

53.png

js的主线程会从自己的执行栈中去执行栈中的所有任务,当发现任务是同步任务时,js会自己进行执行。如果是异步任务,会委托给宿主环境执行。当js发现自己的执行栈中被执行完后,会从任务队列中按顺序把对应的回调函数取出来放入栈中,按顺序执行。

3.EventLoop的基本概念

javascript主线程从“任务队列”中读取异步任务回调函数,放到执行栈中依次执行。这个过程是循环不断的,所以整个的这种运行机制又称为EventLoop(事件循环)。

3.1 结合EventLoop分析输出顺序

import thenFs from "then-fs";

console.log("A");
thenFs.readFile("./studyPrommise/files/1.txt","utf8").then(res=>{console.log("B");})


setTimeout(()=>{
  console.log("C");
},0)

console.log("D");

4.宏任务和微任务

javascript对异步任务又做了进一步的划分,分为了两类,

  1. 宏任务(macrotask)
    • 异步Ajax请求
    • setTimeOut、setInterval
    • 文件操作
    • 其他宏任务
  2. 微任务(microtask)
    • Promise.then、.catch、和.finally
    • process.nextTick
    • 其他微任务
54.png

4.1 宏任务和微任务的执行顺序

55.png

4.2 根据宏任务和微任务分析代码输出的顺序

setTimeout(()=>{
  console.log(1);
})

new Promise(function(resolve){
  console.log(2);
  resolve()
}).then(res=>{
  console.log(3);
})

console.log(4);

最后的结果是 2 4 3 1

所以执行的顺序是:执行的准则是 先执行同步任务,再去任务队列中读取回调函数放入执行栈中,按次序执行。但异步任务中:先执行微任务,再执行宏任务

  1. new Promise()操作
  2. console.log(4)
  3. .then()
  4. setTimeout

4.3 经典面试题

56.png

先来分析同步任务和异步任务,最后来分析异步任务中的宏任务和微任务

所以执行顺序是:同步任务js本身自身处理,而异步任务交给宿主环境执行

js本身处理的过程:

宿主环境处理的过程

所以总的输出结果是: 1 5 6 2 3 4 7 8 9

5.总结

EventLoop和宏任务和微任务.png
上一篇 下一篇

猜你喜欢

热点阅读