繁体   English   中英

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

[英]What is the difference between callback queue and event queue?

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

图1 -

在此处输入图像描述

图 2 -

在此处输入图像描述

在 HTML 的命名法(定义浏览器的事件循环)中,两者都不正确。

我们所拥有的是“任务源” ,它们都可能 map 到不同的任务队列
事件循环处理开始时,用户代理将选择从哪个任务队列中执行下一个任务 该任务本身可能触发事件,或调用回调

这些任务通过各种方式排队,或者作为其他任务的一部分(例如,在任务开始并行工作后,当并行工作完成时,它会要求将任务排队),或者直接来自 IPC 消息(例如,用户发起的事件)。

另请注意,事件循环的一部分调用回调并由事件循环直接触发事件,而不是来自任务: 更新呈现
在那里你会发现一个map回调和各种事件(滚动、调整大小、媒体查询等),它们在事件循环中作为这个特殊位置的一部分被调用,它本身只在一段时间内被调用一次(通常当监视器发送一个垂直同步信号)。

在回调队列中,任务大致分为两类,即任务和宏任务(通常称为任务)。

在以下情况下,任务会添加到宏任务队列中:

  • 一个新的 JavaScript 程序或子程序被直接执行(例如从控制台,或通过运行元素中的代码)。
  • 事件触发,将事件的回调 function 添加到宏任务队列。
  • 达到使用 setTimeout() 或 setInterval() 创建的超时或间隔,导致相应的回调被添加到任务队列中。

微任务是一个简短的function ,它在 function 或创建它的程序退出后执行,并且仅当 JavaScript 执行堆栈为空时,但在将控制权返回给用户代理用来驱动脚本执行环境的事件循环之前。

微任务完全来自我们的代码。 它们通常由承诺创建:.then/catch/finally 处理程序的执行成为微任务。 微任务也在等待的“掩护下”使用,因为它是 promise 处理的另一种形式。

在文献中,您经常会看到他们将宏任务称为任务,将微任务称为作业。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM