谈谈你对同步和异步的了解_了解同步和异步JavaScript –第1部分

同步异步是JavaScript中令人困惑的概念,特别是对于初学者而言。 当两个或多个事物同时发生时(同步), 它们是同步的;而当它们不 同时发生时不是同步), 它们是异步的

尽管这些定义很容易接受,但实际上比看起来要复杂。 我们需要考虑到底什么是同步的什么不是 同步的

您可能会在JavaScript同步中调用普通函数,对吗? 而且,如果您正在使用诸如setTimeout()AJAX之类的东西,您将其称为异步的,是吗? 如果我告诉您两者在某种程度上是异步的,该怎么办?

为了解释原因 ,我们需要向X先生寻求帮助。

方案1 – X先生正在尝试同步

设置如下:

  1. X先生可以回答棘手的问题并执行任何要求的任务。
  2. 与他联系的唯一方法是通过电话。
  3. 无论您有什么问题或任务,为了寻求X先生的帮助来执行; 你打电话给他。
  4. X先生给你答案或完成任务向右走 ,并让你知道它的完成
  5. 您放下接收器的感觉内容,然后出去看电影。

您刚刚执行的是与X先生的同步(来回)通信 。您问他的问题时,他在听,当他回答时,您在听。

有线电话
方案2 – X先生对同步性不满意

由于X先生非常有效率,他开始接到更多电话。 那么,当您打电话给他但他已经在忙于和其他人聊天时会发生什么? 您将无法向他询问您的问题-直到他可以自由接听您的电话为止。 您只会听到忙音。

那么X先生可以做什么来应对呢?

而不是直接接听电话:

  1. X先生雇用了一个新人M先生,并给他一个答录机,以便呼叫者留言
  2. M先生的工作是,一旦知道X先生已经完全处理完所有先前的消息并且已经可以自由地接收 新消息 ,则将消息从答录机传递给X先生。
  3. 因此,现在当您打电话给他时,您不必为忙碌的电话留言,而是等X先生回电 (还没有电影时间)。
  4. X先生处理完他收到的所有排队消息后,他将调查您的问题,并给您回电给您答案。

现在的问题是:到目前为止,这些动作是同步的还是异步的?

混合了。 当您留下您的消息时, X先生没有收听它,因此第四次通信是异步的。

但是,当他回答时, 您正在那里聆听 ,这使回程通信保持同步

我希望到现在为止,您已经对如何在交流中理解同步性有了更好的了解。 是时候引入JavaScript了。

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值