同步和异步是JavaScript中令人困惑的概念,特别是对于初学者而言。 当两个或多个事物同时发生时(同步), 它们是同步的;而当它们不 同时发生时 ( 不是同步), 它们是异步的 。
尽管这些定义很容易接受,但实际上比看起来要复杂。 我们需要考虑到底什么是同步的 , 什么不是 同步的 。
您可能会在JavaScript同步中调用普通
函数,对吗? 而且,如果您正在使用诸如setTimeout()
或AJAX之类的东西,您将其称为异步的,是吗? 如果我告诉您两者在某种程度上是异步的,该怎么办?
为了解释原因 ,我们需要向X先生寻求帮助。
方案1 – X先生正在尝试同步
设置如下:
- X先生可以回答棘手的问题并执行任何要求的任务。
- 与他联系的唯一方法是通过电话。
- 无论您有什么问题或任务,为了寻求X先生的帮助来执行; 你打电话给他。
- X先生给你答案或完成任务向右走 ,并让你知道它的完成 。
- 您放下接收器的感觉内容,然后出去看电影。
您刚刚执行的是与X先生的同步(来回)通信 。您问他的问题时,他在听,当他回答时,您在听。
方案2 – X先生对同步性不满意
由于X先生非常有效率,他开始接到更多电话。 那么,当您打电话给他但他已经在忙于和其他人聊天时会发生什么? 您将无法向他询问您的问题-直到他可以自由接听您的电话为止。 您只会听到忙音。
那么X先生可以做什么来应对呢?
而不是直接接听电话:
- X先生雇用了一个新人M先生,并给他一个答录机,以便呼叫者留言 。
- M先生的工作是,一旦知道X先生已经完全处理完所有先前的消息并且已经可以自由地接收 新消息 ,则将消息从答录机传递给X先生。
- 因此,现在当您打电话给他时,您不必为忙碌的电话留言,而是等X先生回电 (还没有电影时间)。
- X先生处理完他收到的所有排队消息后,他将调查您的问题,并给您回电给您答案。
现在的问题是:到目前为止,这些动作是同步的还是异步的?
混合了。 当您留下您的消息时, X先生没有收听它,因此第四次通信是异步的。
但是,当他回答时, 您正在那里聆听 ,这使回程通信保持同步 。
我希望到现在为止,您已经对如何在交流中理解同步性有了更好的了解。 是时候引入JavaScript了。
JavaScript –异步编程语言
当某人将JavaScript标记为异步时,他们通常指的是如何为其留下消息 ,而不会因忙音而阻塞您的呼叫 。
函数调用在JavaScript中从来都不是直接的 ,实际上是通过消息完成的。
JavaScript使用消息队列来保存传入消息(或事件)。 事件循环 (消息分发程序)将这些消息顺序分发到调用堆栈 ,在该堆栈中,消息的相应功能作为框架 (功能参数和变量) 堆叠在一起以执行。
调用堆栈保存被调用的初始函数的框架,以及通过嵌套调用在其顶部调用的函数的任何其他框架。
当一条消息加入队列时,它会等待直到调用堆栈中的上一条消息中的所有帧都为空时为止;如果是,则事件循环使上一条消息出队 ,并将当前消息的相应帧添加到调用堆栈中。
消息再次等待,直到调用堆栈中的相应帧变为空 (即,所有堆栈函数的执行都结束了),然后将其出队。
考虑以下代码:
function foo(){}
function bar(){
foo();
}
function baz(){
bar();
}
baz();
正在运行的函数是baz()
(在代码段的最后一行),为此将一条消息添加到队列中 ,并且当事件循环拾取该消息时,调用堆栈开始为baz()
堆叠帧 , bar()
和foo()
在相关的执行点。
一旦函数的执行一一完成,它们的框架就会从调用堆栈中删除 ,而消息仍在队列中等待 ,直到从堆栈中弹出baz()
为止。
请记住,函数调用永远不会直接在JavaScript中进行 ,而是通过message完成的。 因此,每当您听到有人说JavaScript本身是一种异步编程语言时,就假定他们正在谈论其内置的“答录机”以及您如何自由地留言。
但是特定的异步方法呢?
到目前为止,我还没有涉及诸如setTimeout()
和AJAX之类的API,这些API被专门称为异步 。 这是为什么?
重要的是要了解同步或异步到底是什么。 JavaScript在事件和事件循环的帮助下可以实现消息的异步处理 ,但这并不意味着JavaScript中的一切都是异步的 。
记住,我告诉过您,直到调用堆栈中没有相应的帧 ,消息才离开,就像您直到得到答案之前才去看电影一样-这是同步的 ,您在那里等待直到任务完成完成 ,您就会得到答案。
等待并非在所有情况下都是理想的 。 如果在留言后无需等待就可以去看电影怎么办? 如果某个函数可以退休(清空调用堆栈),并且甚至在该函数的任务完成之前就可以将其消息出队怎么办? 如果可以异步执行代码怎么办?
这是诸如setTimeout()
和AJAX之类的API出现在其中的地方,它们的作用是……等等,我不能不回头再解释X先生,这将在本文的第二部分中介绍。 。 敬请关注。
翻译自: https://www.hongkiat.com/blog/synchronous-asynchronous-javascript/