JavaScript事件循环同步任务与异步任务

本篇文章给大家带来了关于javascript的相关知识,主要介绍了javascript事件循环同步任务与异步任务,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下。

JavaScript事件循环同步任务与异步任务

【相关推荐:javascript视频教程、web前端】

前言

首先,在学习js中同步异步的问题前,需要明白,js是单线程的,为什么它得是单线程的呢?这得从它的使用场景来看了,它主要是用来让用户与页面进行交互的吧。那么假设js是多线程的,在这个线程里面,用户点击某个按钮会增加一个DOM节点,在另一个线程里面,用户点击这个按钮又会删除一个DOM节点,那么此时js就不知道该听谁的了。那同步异步的出现又是为了什么呢?假设没有异步,那么我们在向服务器请求数据时,可能会因为网络不好,卡了半天,这时候因为是同步的,所以网页必须等待数据请求回来才能继续和用户交互,这样会导致整个网页很奇怪的卡住了,用户体验很不好。

执行栈与任务队列

执行栈

姑且先不说执行栈是什么,先说栈是什么吧。栈就好似一个桶,最先放入的东西肯定是最后拿出来的,就是大家常说的先进后出。

立即学习“Java免费学习笔记(深入)”;

05.png

 那么执行栈就是把图中的内容块变成代码任务,光说肯定说不明白,还是得上代码:

function fn (count) {            if (count <= 0) return            fn(count - 1)            console.log(count)        }fn(3)

这是一段很简单的递归代码,这里我们直接上图解释(这里其实画的不严谨,栈底应该是全局执行上下文):

04.png

js中所有的任务都会在主线程上执行然后形成一个执行栈(请记住这一点!!!)

任务队列

那么队列和栈则是相反的,队列是先进先出的。其实很好理解,和我们平时排队是一个道理,先进入队伍的人肯定先出来。那么任务队列通俗理解就是用来放置异步任务的回调函数的(也请记住这一点!!!)

同步任务与异步任务

先上一点概念性的东西,打个基础:

jQuery任务栏 jQuery任务栏

基于jQueryUI动画效果与拖动方法实现任务栏放大、缩小、可拖动

jQuery任务栏 6 查看详情 jQuery任务栏

同步任务

很多人在理解同步任务的时候会被它的语义搞混,其实同步任务不是同步一起执行的。它是要等待上一个执行任务结束才可以执行下一个任务,这里说起来也并不晦涩难懂,但是还是写段简单的代码解释一下:

console.log(1)console.log(2)console.log(3)

代码很简单吧,很明显输出结果是1,2,3,这就是同步代码,那么我们就可以总结了,同步任务就是在主线程上面排队,然后一个一个进入执行栈执行,直到执行栈为空。

异步任务

还是直接举个栗子:

console.log(1)setTimeout(() => {    console.log(2)}, 1000)console.log(3)

这段代码的输出和上面同步代码的输出不一样,它的输出顺序是1,3,2,这就是异步代码,它并不会按照执行顺序去执行,

同样我们用官方话语总结一下:异步任务指的是,不进入主线程、而进入”任务队列”(Event queue)的任务,只有”任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行 如果不理解没有关系,后面说到了事件循环就会醍醐灌顶了。

js的执行机制

先上比较晦涩难懂的概念:

1. 同步任务由JavaScript 主线程按顺序执行。2. 异步任务委托给宿主环境执行。3. 异步任务完成后,对应的回调函数会被加入到任务队列中等待执行,任务队列又被分为宏任务队列和微任务队列,优先执行微任务队列,常见的微任务有new Promise().then,常见的宏任务有定时器4. JavaScript 主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行。5. JavaScript 主线程不断重复上面的第4 步,在执行回调函数时又会按照上面的四步去执行。

js一直从任务队列中取回调函数,然后放入主线程中执行,这是一个循环不断的过程,所以把它叫做事件循环。

这个还是要简单粗暴的来段代码会更直观一点:

const promise = new Promise((resolve, reject) => {      console.log(1);      setTimeout(() => {          console.log("timerStart");          resolve("success");          console.log("timerEnd");       }, 0);      console.log(2);  });  promise.then((res) => {      console.log(res);  });  console.log(4);

现在我们根据上面的规则一步一步分析这段代码,如果不懂Promise也没有关系,我保证这并不影响你对事件循环的理解。现在你就把自己当成js代码的检察官,要正确把它们放在合适的“位置”

检察官的第一步就是判断哪些是同步代码,哪些是异步代码,OK,首先从上往下看,Promise本身是同步的,所以它应该在主线程上排队,然后继续看pomise.then是个异步任务,并且是属于微任务的,它的回调函数应该在微任务队列中(此时还不在),最后一句输出语句是同步代码,应该在主线程上排队。第二步,执行主线程上的同步代码,首先有Promise排着队呢,所以先输出1,随后有个定时器,所以应该把它挂起执行,由于它没有时间延迟,所以回调函数直接被放入宏任务队列,继续执行代码,遇到打印,直接输出2。现在主线程还有其他的同步代码不?是不是还有一个输出语句,所以输出4,现在主线程上的同步代码执行完了第三步读取任务队列,由于微任务队列上没有东西(Promise的状态并没有改变,不会执行promise.then()),所以读取宏任务队列上的回调函数,回调函数进入主线程执行,首先输出timerStart,然后promise状态发生改变,然后又遇到一个输出语句,输出timerEnd。现在主线程上又没有东西了,又得去看任务队列上有没有东西了。第四步,由于promise状态发生改变了,所以微任务队列上有回调函数了,执行输出语句,res为success,输出success

【相关推荐:javascript视频教程、web前端】

以上就是JavaScript事件循环同步任务与异步任务的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/545811.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何为iPhone15Plus下载固件包?最新版本获取攻略
上一篇 2025年11月9日 17:32:45
《魔力宝贝复兴》魔币怎么获得-魔币快速获取方法介绍
下一篇 2025年11月9日 17:32:51

相关推荐

  • php数据如何实现文件断点续传_php数据大文件上传解决方案

    断点续传通过文件分片、唯一hash标识、服务端记录上传状态实现,前端切片上传并查询已传分片,PHP后端存储分片并在完成后合并,同时提供状态接口支持续传,需注意hash一致性与临时文件清理。 大文件上传在Web开发中是个常见需求,尤其是涉及视频、备份文件或资源包时。PHP本身对文件上传有一定限制,但通…

    2026年9月24日
    000
  • PHP 中如何将 JSON 数组值声明为变量

    本文介绍了如何在 PHP 中从数据库获取数据并将其编码为 JSON 格式,然后通过 AJAX 请求传递到另一个页面。重点讲解了如何在接收页面解析 JSON 数据,并将 JSON 数组中的特定值提取并赋值给变量,以便在后续的 PHP 函数中使用。 从数据库获取数据并编码为 JSON 首先,我们需要从数…

    2026年9月24日
    000
  • Laravel 表单多动作处理:区分同一路由下的提交操作

    本教程将详细介绍如何在 laravel 应用中,通过一个 html 表单的多个提交按钮触发不同的后端操作,而无需为每个操作创建单独的表单或路由。核心方法是为提交按钮添加 `name` 和 `value` 属性,然后在控制器中根据这些属性的值来判断执行哪种业务逻辑,从而实现如更新用户角色和删除用户等多…

    2026年9月24日
    000
  • 动态表单输入中多答案数据处理教程

    本教程旨在解决Web开发中,如何高效处理包含动态数量答案的表单提交数据,特别是当需要更新现有问题及其关联答案时。文章将详细阐述前端表单的命名策略以及后端PHP如何解析这些动态输入,以准确获取答案内容及其对应的数据库ID,从而实现数据的精准更新,并提供最佳实践建议。 理解动态答案更新的挑战 在构建问答…

    2026年9月24日
    100
  • 使用 PHP 解析 JSON 文件并在网页上显示特定数据

    本文旨在帮助开发者学习如何使用 PHP 解析 JSON 文件,并提取其中的特定数据,将其以结构化的方式展示在网页上。我们将通过一个简单的示例,演示如何读取 JSON 数据,解析成 PHP 数组,并最终以 HTML 表格的形式呈现。 PHP 解析 JSON 数据 JSON (JavaScript Ob…

    2026年9月24日
    200
  • PHP Web开发:高效处理动态数量问题答案的表单更新与ID获取

    本教程探讨在PHP Web开发中,如何高效处理具有动态数量答案的问题更新表单。针对需要同时获取答案文本值及其对应ID的场景,文章详细介绍了通过合理设计表单字段命名和利用$_POST超全局变量的键值迭代特性,实现对动态生成答案字段的准确解析和数据提取,确保更新操作的完整性。 问题背景与挑战 在开发问答…

    2026年9月24日
    100
  • JavaScript 中替换 JSON 数据值的实用指南

    本文旨在提供一个清晰、简洁的 JavaScript 教程,讲解如何根据特定条件,利用响应数据中的值替换 JSON 数据中的指定字段。我们将通过实例代码演示如何处理包含 “All” 值的 Emp_Id 字段,并使用响应数据中的 ID 值进行替换,最终生成期望的 JSON 数据结…

    2026年9月24日
    200
  • Laravel Blade中条件隐藏元素的优雅实践

    本文探讨了在Laravel Blade模板中如何高效地实现HTML元素的条件隐藏。针对传统@if-@else语句导致代码冗余的问题,教程提出使用Blade的内联三元运算符在style属性中动态控制display: none,从而避免重复代码,提升模板的可读性和维护性。此外,还将介绍如何利用CSS类和…

    2026年9月24日
    200
  • VSCode主题开发:创建动态色彩主题的进阶技术解析

    动态主题需通过外部插件监听系统事件实现,核心是利用vscode.themeColor API响应主题切换,结合语义化作用域与Semantic Highlighting精准控制配色逻辑,实现智能自适应视觉体验。 想让VSCode主题随环境自动切换色彩?动态主题不只是换个配色那么简单。核心在于理解VSC…

    2026年9月23日
    400
  • PHP同页面无限次表单提交与显示:防止数据覆盖的实现技巧

    本教程详细阐述了如何在php中实现同页面多次表单提交而不覆盖先前数据的方法。核心策略是利用html的数组命名输入(`name=”field[]”`)来收集多个值,并在每次页面刷新时,通过隐藏输入字段重新提交已有的数据,从而在不依赖数据库的情况下,实现“无限”次提交并显示所有历…

    2026年9月23日
    100
  • VS Code自动化测试:持续集成与测试覆盖率

    VS Code通过插件和工具集成支持自动化测试、CI流程与覆盖率分析。①配置Jest或pytest等框架,结合Test Explorer UI插件实现测试运行与调试;②利用GitHub Actions等CI服务,在代码推送后自动执行测试,通过插件在编辑器内查看状态;③启用Coverage Gutte…

    2026年9月23日
    100
  • 悟空浏览器如何使用全局媒体控制器_悟空浏览器多媒体播放控制中心使用技巧

    1、确保悟空浏览器通知权限开启,以激活系统媒体控制;2、检查网站是否配置Media Session API,必要时注入脚本补充元数据与控制函数;3、结合画中画与后台播放功能,维持媒体会话活跃,实现锁屏或切换应用时的持续控制。 如果您在使用悟空浏览器播放网页媒体时,希望利用系统级的媒体控制功能来管理播…

    2026年9月23日
    100
  • 使用正则表达式实现字符串大小写不敏感替换

    本文将介绍如何利用正则表达式,高效、简洁地实现字符串中特定单词的大小写不敏感替换,从而将所有形式的单词统一转换为指定大小写。通过运用正则表达式的“不区分大小写”模式,可以避免为每种大小写变体编写单独的替换条件,极大提升代码的简洁性和可维护性。 在编程实践中,我们经常会遇到需要将字符串中某个单词的所有…

    2026年9月23日
    600
  • PHP如何设置视频自动播放_PHP设置视频自动播放方法

    答案:PHP通过生成含autoplay和muted属性的HTML5 video标签实现视频自动播放。具体描述:PHP动态输出视频路径与播放设置,结合autoplay、muted、controls等属性,在浏览器限制下提升自动播放成功率,尤其用于背景视频循环播放场景。 PHP 本身是服务器端语言,不能…

    2026年9月23日
    2200
  • 在PHP中将JSON数组值声明为变量

    本文介绍了如何在PHP中从数据库获取数据并将其编码为JSON数组,然后通过AJAX调用将其传递到另一个页面。重点讲解了如何在接收数据的页面中解析JSON数据,并将JSON数组中的特定值提取为PHP变量,以便在后续的函数或查询中使用。 从数据库获取数据并编码为JSON 首先,我们需要从数据库中获取数据…

    2026年9月23日
    1200
  • PHP:根据条件动态禁用表格中的按钮

    本文旨在解决在PHP中,根据表格行中两列的值是否相等,动态禁用对应按钮的问题。通过修改循环遍历数据并生成HTML表格的代码,在生成按钮时增加条件判断,实现当mi_name列和item_name列的值相等时,禁用该行的按钮。文章提供两种实现方式,并附带代码示例,帮助开发者快速实现此功能。 在PHP中动…

    2026年9月23日
    200
  • 在无Maven或Eclipse环境下手动构建Java Web应用WAR包的教程

    本教程详细介绍了如何在不依赖Maven或Eclipse等集成开发环境的情况下,为Java Web应用程序手动生成WAR(Web Application Archive)文件。文章首先阐述了WAR文件的基本结构,随后通过一个Ant构建脚本的实例,指导读者完成从源代码编译、文件组织到最终WAR包生成的全…

    2026年9月23日
    200
  • 微软免费文件恢复工具介绍

    微软免费文件恢复工具介绍微软免费文件恢复工具介绍微软免费文件恢复工具介绍微软免费文件恢复工具介绍

    现在好了,最近微软在 windows 10 应用商店中上架了一款免费的数据删除恢复工具 windows file recovery,猿妹再也不用担心误删文件了。 Windows File Recovery基于命令行程序设计,大小仅有8.26MB,所有Windows 10用户均可免费下载使用。 无论是…

    2026年9月23日 用户投稿
    200
  • Prestashop分类描述在分页时的显示行为解析与SEO考量

    Prestashop商店中,分类描述通常仅在首个分页页面显示,而在后续分页页面上消失,甚至从第二页返回第一页时也可能不显示。这并非一个技术故障,而是Prestashop的默认行为,且从SEO角度看,只要描述在直接访问的第一页可见,就已满足核心要求,无需在所有分页页面重复显示,以避免潜在的重复内容问题…

    2026年9月23日
    100
  • 处理动态数量问答数据的更新教程

    本教程旨在详细阐述如何有效地管理和更新包含动态数量答案的问题数据。我们将探讨在Web表单中如何设计输入字段以捕获答案内容及其唯一标识符,并通过服务器端(以PHP为例)解析提交的数据,从而实现对现有答案的精确更新和新答案的添加,确保数据一致性和系统健壮性。 场景概述:处理动态数量的问答数据更新 在许多…

    2026年9月23日
    100

发表回复

登录后才能评论
关注微信