宏任务、微任务

137 阅读2分钟

简单理解JS宏任务和微任务的区别

首先:需要明白js中同步和异步的概念,进而了解宏任务和微任务的区别。

明白一个概念:js是是单线程的语言。

用通俗的话说,当你在面对多件事情时,会将事情先按照轻重缓急进行分类。 那些你放置到后面的事情,就是相当与将其放置到了一个你的任务队列表中。 等待你手头的事情执行完之后,你翻看了自己的任务队列本,将其拿出来在做。

宏任务

 setTimeout(function () {
  console.log('定时器');
}, 4)
 // 同步:放到主线程立即执行,执行完之后再执行定时器这个任务
console.log('同步');`

setTimeout就是一个宏任务的代表,当有一个定时器被创建时,(首先会将其放置到您的任务队列本中),放置到定时器模块中,当4毫秒到达之后,将其放置到任务队列中,等待同步代码执行完成之后,再将任务列表中的事情拿出来做。

![JZY9FB2KB``UIU{_23TDUK.png

一、这里有一个非常容易忽略的点:定时器中的4毫秒执行完成之后,并不会立即执行, 它必须等待同步代码完成之后,才会执行。 如:

setTimeout(function () { console.log('定时器'); }, 4) console.log('同步'); for (let i = 0; i < 10000; i++) { console.log(i); }

同步执行完for循环之后,才会执行定时器中的任务。

、当有多个定时器时,会将优先执行完定时器模块中的事放置到任务队列中执行。 也就是如果有一个等待4毫秒的定时器,若还有一个1000毫秒的定时器,则会优先将4毫秒中的定时器模块放置到任务队列中,后放置1000毫秒定时器模块到任务队列中

微任务

`

console.log('同步');

setTimeout(function () {
  console.log('定时器');
}, 4)

Promise.resolve().then(value => {
  console.log('Promise');
})`

Promise同样会放置到任务队列中,它会优先于宏任务执行,等待同步代码执行完成之后,才会执行微任务,最后是宏任务。

其区别就是微任务优先于宏任务执行。

简单的来说,你此刻有三件事情需要来做,你首先会执行此刻正在手上做的事情,而您的任务队列本上的事情有缓急之分,这个时候会先将急迫的事情做了(微任务)、完成之后,再进行第三件事情(宏任务)。

官方的话来说:任务之间的不平等,有些任务对于用户而言更加重要,需要先执行,有些任务(类似定时器)晚点执行也没有什么问题

宏任务和微任务相当于一种优先级队列的方式。

最常见的宏任务:setTimeout、setInterval。

常见的微任务:promise、async