宏任务和微任务的理解

了解Promise过程中,经常遇到一个名词就是微任务,对应的还有宏任务,不管是面试上都会有人提及到。
在了解微任务和宏任务之前,我们需要先了解一个什么是事件循环。
事件循环和微任务和宏任务之间的关系。

事件循环是一个在java引擎等待任务,执行任务和进入休眠状态等待任务这几个状态之间转换的无限循环。
引擎的一般算法:当有任务时从最先进入的任务执行,然后休眠直到出现任务,不限的循环。
javascript引擎大多数时候不执行任何操作,它仅在脚本/处理程序/事件激活的时执行。
任务示例:
当外部脚本 script src="..." 加载完成,任务就是执行它。
当用户移动鼠标时,任务就是派生出mousemove事件和执行处理程序。
当安排setTimeout 时间到达时,任务就是执行其回调。
等等。
多个任务组成一个队列,即所谓的宏任务队列。
微任务仅来自于我们的代码,它通常是由promise创建的:对.then/catch/finally处理程序的执行会成为微任务。微任务也被用于await的幕后,因为它是promise处理的另一种形式。
还有一个特殊的函数queueMicrotask(func),它对func进行排队,以在微任务队列中执行。

每一个宏任务之后,引擎会立即执行微任务队列中的所有任务,然后在执行其他的宏任务,或者渲染,或进行其他任何操作。

setTimeout(() => alert("timeout"));

Promise.resolve()
  .then(() => alert("promise"));

alert("code");

执行的顺序:
code 首先显示,因为它是常规同步调用的。
promise第二个出现,因为then会通过微任务队列,并在当前代码之后执行。
timeout 最后一个显示,因为它是一个宏任务。

posted @ 2022-07-07 11:58  夏季的雨  阅读(1028)  评论(0)    收藏  举报