回调队列和事件队列有什么区别?

6
在一些关于JavaScript异步行为的在线资源中,也提到了浏览器架构、调用栈、事件循环和事件队列等概念。在描述浏览器事件循环的工作原理时,有些人使用“事件队列”,而其他人则使用“回调队列”。我对这些术语感到困惑,想知道它们是否指的是在浏览器中使用的同一队列数据结构,或者它们是否不同并用于处理不同的情况?
图1 -

enter image description here

图2 -

enter image description here

2个回答

5
在HTML的命名法中(它定义了浏览器的事件循环),两者都是不正确的。
我们拥有的是"任务源", 它们可以映射到不同的任务队列
事件循环处理开始时,用户代理将从哪个任务队列中选择执行下一个任务。这个任务本身可能会触发事件调用回调函数
这些任务通过各种方式排队,可以作为其他任务的一部分(例如,在任务并行工作后,当并行工作完成时,它将要求排队一个任务),也可以直接从IPC消息中触发(例如用户启动的事件)。
还请注意,有一个事件循环的部分,在其中回调被调用并且事件直接由事件循环触发,而不是来自任务:更新渲染。 在那里,您会找到一个回调映射和各种事件(滚动、调整大小、媒体查询等),作为事件循环中这个特殊位置的一部分调用,该位置本身只会偶尔被调用(通常在监视器发送V-Sync信号时)。

非常感谢您正确地解释了事件循环的过程,将其称为任务队列是有道理的,因为在浏览器生态系统中还存在其他概念,例如微任务队列。您能否推荐一些高质量的资源,以便更好地掌握这些概念?(除了上面提到的链接之外的其他链接) - Aravinda Meewalaarachchi
1
微任务是另一种不同的任务,它们只能在非常特定的情况下(长时间任务)被选为主要任务。微任务队列的工作方式完全不同,它会在单个事件循环迭代中多次被清空(在“微任务检查点”中,在每次JS调用堆栈为空以及某些回调调用之后)。有关所有这些内容的参考资料是Jake Archibald的In the loop,它所说的都相当正确和易于理解,然后我在该主题上写了a few answers - Kaiido

0
在回调队列中,任务被广泛地分为两类,即微任务宏任务(通常称为任务)。 宏任务在以下情况下被添加到宏任务队列中:
  • 执行新的JavaScript程序或子程序(例如从控制台或通过在元素中运行代码)。
  • 事件触发,将事件的回调函数添加到宏任务队列中。
  • 达到使用setTimeout()或setInterval()创建的超时或间隔,导致相应的回调被添加到任务队列中。
微任务是一个短小的函数,在创建它的函数或程序退出后执行,并且仅当JavaScript执行堆栈为空时才执行,但在返回控制权给用户代理用于驱动脚本执行环境的事件循环之前执行。
微任务仅来自我们的代码。它们通常由Promise创建:.then/catch/finally处理程序的执行成为微任务。微任务也被“await”使用,因为它是Promise处理的另一种形式。
在文献中,您经常会看到将宏任务称为任务,将微任务称为作业。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接