JavaScript队列管理
陈碎碎_
编辑于 2023年03月17日 19:06
收录于文集
共1篇

    JavaScript中的宏观队列(macro task queue)和微观队列(micro task queue)是用于管理异步操作的两个重要的队列。

    宏观队列包括所有的异步任务,如setTimeout、setInterval、setImmediate、I/O操作等。这些任务会被添加到宏观队列的末尾,等待JavaScript引擎处理。

    微观队列是一种特殊的队列,用于管理Promise和process.nextTick()这样的任务。这些任务会在当前任务执行完成后,立即执行。也就是说,当JavaScript引擎遇到一个微观任务时,它会将它添加到微观队列的末尾,等待当前任务执行完成后立即执行。

    当JavaScript引擎空闲时,它会先检查微观队列是否为空。如果不为空,就会依次执行微观队列中的任务,直到微观队列为空为止。然后它会去检查宏观队列中是否有任务,如果有就会依次执行宏观队列中的任务。

    在异步编程中,理解宏观队列和微观队列的概念非常重要。它们帮助我们了解JavaScript的事件循环模型,并且可以帮助我们避免一些常见的问题,如回调地狱和长时间的阻塞。

    例如:

    

打印顺序

  1. 第一次打印 1 是毋庸置疑的,自上而下的顺序 但是他遇到了setTimeout

  2. 因为 setTimeout 是一个宏观任务 那么问题又来了 什么是微观任务什么是宏观任务

    1. 宏观任务: 在早期ECMAScript规范中JavaScript不存在异步的操作模式 JavaScript将代码交给引擎后 引擎只按顺序执行代码,这个由宿主JavaScript的宿主可以理解为浏览器自身)发起的任务我们称为宏观任务

    2. 微观任务:在ECMAScript 5 (或称为ECMAScript 2009) 之后的规范中出现了异步任务 例如 promise await/async 此类任务不需要浏览器安排其执行 引擎可以自己发起任务 称之为微观任务

  1. 上述知道微观和宏观之后解释一下执行顺序 当js代码运行从上到下时遇到setTimeout之后会将其移入宏观任务队列当进入宏观任务队列让出进程 ,继而执行Promise,输出3,4。因为Promise是一个微观任务,所以它会在当前任务执行完成后立即执行。调用resolve()会将then()的回调函数添加到微观队列末尾。

  2. 输出6,表示当前任务执行完成。

  3. 此时JavaScript引擎空闲,开始执行微观队列中的任务。输出5,表示Promise的then()回调函数被执行。

  4. 最后执行宏观队列中的任务,输出2,表示setTimeout的回调函数被执行。

需要注意的是,setTimeout的延时为0毫秒并不是真正的0毫秒,而是在宏观队列中排队等待执行。因此,它的执行顺序可能会被微观任务的执行所影响。