JavaScript中的事件循环介绍

70 阅读5分钟

JavaScript中的事件循环

JavaScript是单线程的,意味着一次只能执行一个动作。事件循环是要调用的命令队列。

JavaScript是任何网站不可或缺的一部分。它负责所有的逻辑和数据操作。它是用于建立网站的最流行的语言。这种用途极广的语言几乎可以用于任何事情。这并不一定意味着它将最适合所有的应用,但它将能够在许多方面与主要语言竞争。正是这种多功能性使它值得去了解它的基本机制,从而了解它的优点和缺点。

JavaScript是单线程的,这意味着一次只能执行一个动作。JavaScript使用一个线程来处理所有的请求,但在创建上下文时,它使用其他线程来处理输入/输出,因此它不会卡住。JavaScript可以在线程之间进行通信,使用能够创建这种其他线程的外部接口,它可以进行通信。例如,如果你创建了一个网页,它在一个单一的线程上运行,但能够与其他线程通信,这些线程为一些特定的目的工作。使用相机时就是这种情况。相机对于浏览器来说是这样一个独立的服务,是一个独立的线程。而且这不是发生在我们的线程上,而是在一个外部线程上。

让我们来探讨一下进入事件循环的结构。

什么是堆栈/队列?

  • 堆栈是一个数据结构,在这个结构中,最后出现的东西会先被执行。
  • 队列--先来的东西会被先执行。
  • Web APIs- 浏览器提供的额外接口。它们在独立的浏览器线程上运行。这些包括与计时器(如setTimeout)、发送XHR请求(XMLHttpRequest类)或操作和响应DOM树上的事件有关的方法。

一个Web API从后续的数据结构,决定哪些元素在浏览器中执行更重要。我们有主线程和侧线程,但在某些时候,我们必须决定何时将结果转移到主线程。而在这里,我们可以决定如果同时有两件事情在等着我们,哪件事情更重要。

我们将队列分为宏观和微观任务以及一个渲染队列。它们包含函数调用,表示为对Web API的异步方法的回调。(setTimeout, setInterval, xhr, querySelector)。只要有这样的任务要执行,事件循环就会执行任务。首先是微观的,然后是宏观的。在渲染的情况下,事件循环会处理队列中的内容,而不是其他。如果有东西出现,它就必须等待。

同步/异步代码

  • 同步的:逐行执行。这里的特殊之处在于,我们一次只能执行一段代码。一旦我们启动它,在它完成之前,我们无法做任何事情。
  • 异步: 可以与应用程序的其他部分并行执行而不干扰它,但行动的结果也不是即时的。例如:同时查询API和制作动画。

事件循环的三个主要元素。EL是要调用的命令队列。而且不管它们是同步的还是异步的,这些都是用户执行过的、必须处理的动作。它们在队列中等待,每个人都被依次带走,按照它们来时的顺序,当它们被收集起来时,决定被执行。如果是同步的,它就在那个时候执行,其余的等待,并进入JavaScript。如果是异步的,它的指示器被写入内存芯片,而它的执行本身被委托给网络API。事件循环忘记了这一点,它只是传递信息说这是异步代码,"帮我做,只要给我结果"。事件循环不断地从队列中一个接一个地取走东西。委托给Web API的事情无论如何都要排队,这样一来,所有的事情都是连续完成的,也就是说,在一个 "循环 "中。

什么是 "事件循环"?

JavaScript是一种编程语言,它可以在网站上实现复杂的元素,使网站不仅可以显示静态信息,还可以适当地处理内容变化,显示互动地图和2D/3D图形的动画,显示视频等等。由于有了JS,你可以在网站上采取动态的内容创建,控制多媒体,对图像进行动画处理,以及其他几乎所有的事情。

事件循环决定了代码的运行顺序。它将同步和异步的世界结合起来。如果我们依次做某事,我们就可以访问它。如果我们委托某事,我们希望以后能够保留其中的价值。例如,向服务器进行查询以获取数据--我们不仅希望数据被检索到,而且还希望能收到它。而且,由于我们的代码已经走到了某个地方,我们需要有一些机制来在未来拾取这些数据。

为了理解什么是事件循环并学习它的所有机制,我们需要区分两个概念,即同步代码和异步代码。同步代码是指当被调用时,逐行调用自己,没有副作用,并将从A到Z执行,正是被调用的内容。另一方面,异步代码是指在调用的某些阶段,部分代码被委托给另一个线程或在另一个时间调用。例如,我们想创建一个动画并同时从服务器上下载数据。如果我们在同步代码中这样做,我们将不得不等待数据或显示一个动画。在异步代码中,我们可以在同一时间交替执行任务。我们不会注意到这一点,因为它将由浏览器来管理。