什么是异步JavaScript中的Microtask Queue和Callback Queue的区别

什么是异步JavaScript中的Microtask Queue和Callback Queue的区别

要了解Microtask Queue和Callback Queue之间的区别, 我们需要清楚异步JavaScript的执行方式以及Microtask Queue和Callback Queue所扮演的角色。

在JavaScript中,与其他函数或操作并行运行的函数或操作被称为异步函数或操作。异步JavaScript代码需要在预定时间之后执行的回调函数。

例如: 以下代码示例演示了JavaScript中setTimeout()函数的使用。

<script>
  setTimeout(function greet() {
    console.log("Welcome to GeeksforGeeks!");
  }, 2000);
</script>

现在,在经过了这段期望的时间之后,代码需要被传递到 调用堆栈 ,但是调用堆栈并没有提供一个延迟执行代码的计时器。因此,它使用了一个在浏览器的全局对象 window 中可用的 setTimeout() 网页API的帮助。在一定的时间段之后,调用堆栈通过 事件循环 获取代码,该事件循环会将回调函数传递给调用堆栈。但是,回调函数不能直接进入事件循环。

什么是异步JavaScript中的Microtask Queue和Callback Queue的区别

因此,微任务队列和回调队列的作用就在于这里。这些队列充当中介,一旦定时器到期,回调函数就会按顺序放入这些队列中。当调用栈为空时,事件循环将它们按FIFO顺序从队列中取出并放入调用栈中。

但是,我们需要微任务队列和回调队列来实现不同的目的。让我们来看看它们之间的比较。

回调队列: 在定时器到期后,回调函数会被放入回调队列中。事件循环会检查调用栈是否为空,如果为空,则将回调函数从回调队列推入调用栈,并从回调队列中删除该回调函数。然后,调用栈创建一个执行上下文并执行它。有时,这个回调队列也被称为任务队列或宏任务队列。

微任务队列: 微任务队列就像回调队列,但是微任务队列有 更高的优先级 。通过 Promises 和 Mutation Observer 传递的所有回调函数都会进入微任务队列。例如,对于 .fetch() ,回调函数将进入微任务队列。Promise处理始终具有更高的优先级,因此JavaScript引擎会执行微任务队列中的所有任务,然后再转到回调队列。

回调队列 微任务队列
回调队列接收通过setTimeout() API设置的定时器到期后的普通回调函数。 微任务队列接收通过Promises和Mutation Observer传递的回调函数。
回调队列在提取回调函数到事件循环中的优先级较低。 微任务队列在提取回调函数到事件循环中的优先级较高。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程