首页 > 编程语言 >与异步 JavaScript 同步

与异步 JavaScript 同步

时间:2022-09-25 11:44:20浏览次数:80  
标签:异步 同步 函数 JavaScript 调用 堆栈 执行

与异步 JavaScript 同步

介绍

如果您是 JavaScript 开发人员,您可能听说过 JavaScript 是一种单线程、非阻塞、同步、并发的编程语言,具有很大的灵活性。

尽管确实如此,但 JavaScript 代码是异步执行的,这使程序能够处理调用堆栈中的耗时任务,并且仍然可以响应浏览器上的其他事件。

这些潜在的耗时任务可能是:

拿来: 它是一个 API,允许程序使用 HTTP 请求从外部获取资源。

设置超时: setTimeout() 它设置一个计时器,该计时器执行一个功能或一旦计时器用完。

地理位置 API: 它允许用户自愿向应用程序提供访问其地理位置到 Web 应用程序的权限。

什么是异步 JavaScript?

因此,本质上,异步 JavaScript 意味着一个程序可以一起运行多个任务,而无需等待其他任务完成并冻结程序。

让我们通过一个例子更好地理解异步代码:

你认为这段代码的结果是什么?

没有得到正确答案的布朗尼积分。代码按预期运行。

现在让我们添加一个异步函数,看看它如何改变代码的执行。

拍一张。你认为这段代码的输出会是什么?

如果你猜对了,赞一个。

如您所见,包含在 setTimeOut 中的函数在其余代码执行后执行。

这是因为在调用 setTimeOut 时,JS 引擎会创建一个新的函数执行上下文并将其添加到调用堆栈中,该调用堆栈在时间到期后运行,在本例中为 2000 毫秒(或 2 秒)。

这是最基本的异步代码示例。

重要的是要记住,JavaScript 仍然是一种单线程编程语言,但借助事件循环、调用堆栈和 Web API 等浏览器功能实现了异步

为了更好地理解异步,我们将不得不仔细研究调用堆栈和事件循环

调用堆栈

堆栈是计算机科学中的一种基本数据结构,它遵循 LIFO(后进先出)结构。调用堆栈只是一种跟踪函数调用的机制。

当 JavaScript 代码被执行时,首先发生的是 全局执行上下文 被建造。

接下来,每当调用一个函数时,JS 引擎都会创建一个唯一的 函数执行上下文 ,它位于调用堆栈的顶部。此外,如果它是一个调用函数,并且有一个回调函数,那么 JavaScript 引擎会创建另一个函数执行上下文并将其放置在调用堆栈的顶部。

一旦函数执行完毕,它就会从堆栈中弹出,调用堆栈开始执行下一个函数执行上下文。这本质上就是调用堆栈的工作方式。

然而,调用堆栈只是一个更大的难题的一小部分,即事件循环。

事件循环

因此,总结一下我们到目前为止所学到的知识,JavaScript 是一种单线程编程语言,这意味着它从顶部开始执行脚本并一直工作到底部,沿线程推送和弹出函数执行上下文 (FEC)方式,从而异步执行多个功能。

通常,在同步运行时执行需要很长时间的函数会冻结程序,尽管是暂时的。

现在在我们继续理解事件循环之前,我们需要理解另一个难题,队列。

在计算机科学中,队列是一种两端开放的线性数据结构,即它遵循先进先出 (FIFO) 顺序,与堆栈相反。

JavaScript 运行时使用一个任务队列,其中包含必须处理的任务列表,每个任务都有一个关联函数,需要调用该函数才能完成任务。

本质上,事件循环是 JavaScript 运行时将任务从队列中拉出并将其放入调用堆栈的过程,只要堆栈为空。尽管这是对一个相当复杂的概念的过度简化,但它本质上是异步代码的执行方式。

这就是我们如何得到 JavaScript 是多线程的错觉,尽管它的核心是并且永远是单线程的。

所以现在让我们使用我们在文章前面使用的 setTimeOut 函数示例来连接这些点。

当代码开始运行时,它会执行第 3 行。直到现在都没有意外。

在下一步中,当它到达行号时。 5、JS运行时注意到这个函数有一个2秒的定时器,这意味着它不能立即运行。因此,它立即将其放入任务队列并继续执行下一行代码。

正如预期的那样,“一”、“三”和“四”会立即记录在控制台中,2 秒后,事件循环将回调函数从队列中取出并放入堆栈,“二”得到登录控制台。

这本质上就是事件循环的工作方式,反过来,异步 JavaScript 也能工作。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39164/33432511

标签:异步,同步,函数,JavaScript,调用,堆栈,执行
From: https://www.cnblogs.com/amboke/p/16727536.html

相关文章

  • JavaScript 中的 Web 组件介绍:创建一个 hello-world 的 Web 组件
    JavaScript中的Web组件介绍:创建一个hello-world的Web组件WebComponents是一套不同的技术,允许您创建可重用的自定义html元素。它的伟大之处在于对组件的逻辑和......
  • 二--5.经典进程的同步问题
    先申请资源信号量,再申请互斥信号量1.生产者-消费者问题   1.1利用记录型信号量......
  • html中select option原生JavaScript按照value值 或 按照文本 选择指定选项
    每次搜索大家都在说JQ。。但是我只会用原生js  因为强迫症 不想因为一个小功能引入一个大的js文件以下是原生JavaScript按照value值或按照文本选择指定的optio......
  • MySQL双主同步的实现
    双主复制:在两个节点上都可以写入数据,互为主从节点。解决单点失败的问题:一个主节点失败,所有节点都会失败。双主配置:(1)各节点使用一个惟一server_id(2)都......
  • 利用rabbitmq异步实现来提升程序处理性能
    近期交易系统出款交易量猛增,从skywalking监控平台查看程序调用链路(trace),发现在调用外部三方接口的方法会耗时将近一半。鉴于出款交易在业务上是异步处理的,所以,商定考虑将调......
  • JavaScript 计时事件
    做一个在设定的时间间隔之后来执行代码,称为计时事件两个关键字:setInterval()-间隔指定的毫秒数不停地执行指定的代码setTimeout()-在指定的毫秒数后执行指定代码。......
  • JavaScript 弹窗
    JavaScript中有三种消息框:警告框、确认框、提示框警告框:用于确保用户可以得到某些信息语法:window.alert("****");确认框:用于验证是否接受用户操作语法:window.con......
  • 线程同步(线程锁)
    多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)但是当线程需要共享数据时,可能存在数据不同步的问题。为了避免这种情况,引入了锁的概念。1lock=threading.Lo......
  • Python 异步上下文管理器
    1、参考来源https://docs.python.org/zh-cn/3.9/reference/datamodel.html?highlight=aiter#asynchronous-context-managers2、代码示例1#-*-coding:utf-8-*-......
  • JavaScript Window Navigator
    window.navigator对象包含有关访问者浏览器的信息Window.Navigator次对象也可不写前缀navigator不应该用来检测浏览器的版本:navigator数据可被浏览器使用者更改一些......