JS_异步任务之流程控制

深入理解JavaScript事件循环:宏任务与微任务的执行机制 在JavaScript异步编程中,事件循环是核心的运行机制,它通过任务队列管理代码的执行顺序。其基本原理是单线程模型下,通过事件循环不断从任务队列中取出任务执行,实现非阻塞的异步操作。这一机制的技术价值在于保证了高优先级任务的即时响应,从而提升用户体验和页面性能。常见的应用场景包括DOM更新、网络请求处理和动画渲染等。本文聚焦于事件循环中的宏任务与微任务,详细解析了setTimeout、Promise等异步API的执行优先级差异,并通过典型面试题演示了任务队列的调度过程,帮助开发者掌握异步代码的时序控制。 阅读详情
需知:

1,JavaScript只有一个核心的主线程,但它有存放异步任务的任务队列(task queue)。
2,主线程中是正在运行的同步任务(异步任务开始运行则也会变为同步任务),每次同步任务完成后就会去查看异步任务列表,如果查看时有异步任务达到它的运行条件(比如AJAX请求返回了结果)则把此任务放入主线程中开始执行,主线程的同步任务完成了又会去查看异步任务列表中的每个任务是否达到运行条件,如此往复,直到主线程中的同步任务全部完成以及异步任务列表清空了则脚本结束。
3,回调函数是异步操作最基本的方法,有回调函数的函数将成为异步任务被挂起,(在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。)
4,事件监听也是异步任务。
5,“发布/订阅模式”(又称为:“观察者模式”(observer pattern)),事件完全可以理解成“信号”,如果存在一个“信号中心”,某个任务执行完成,就向信号中心“发布”(publish)一个信号,其他任务可以向信号中心“订阅”(subscribe)这个信号,从而知道什么时候自己可以开始执行。

异步操作的流程控制

1,流程控制之串行执行
// 1,流程控制之串行执行(串行执行是最常见的任务执行流程,比较直观,运行效率稍低于串并行执行,再就是并行执行,但是占用的系统资源是最少的)
var items = [1, 2, 3, 4, 5, 6]; //每个任务的参数
var results = []; //每个任务的结果

function async (arg, callback) { //带有回调函数的函数被视作异步任务,
  // 没有达到此异步任务的执行条件将会被引擎放入任务列表被挂起,达到异步任务执行条件执行时会通过回调函数进入主线程,
  // 主线程中执行的都是同步任务,异步任务开始执行后也变成的同步任务。
  console.log('参数为 ' + arg + ' , 1秒后返回结果');
  setTimeout(function () {
    callback(arg * 2);
  }, 1000);
}

function final(value) { //任务列表执行完成后最终调用的函数
  console.log('完成: ', value);
}

// 流程控制函数之串行执行(serial:串行)
function series(item) {
  if (item) { //如果参数不为null或undefined,则执行此次异步任务
    async (item, function (result) {
      results.push(result); //把每次运行结果放入results数组中
      return series(items.shift()); //递归series函数以进行下次任务
    });
  } else { //items中的参数全部用完则任务全部完成,跳出递归,运行final()
    return final(results[results.length - 1]);
  }
}

series(items.shift()); //开始启动任务列表

2,流程控制之并行执行

// 2,流程控制之并行执行,(并行执行的效率较高,比起串行执行一次只能执行一个任务,较为节约时间。但是问题在于如果并行的任务较多,很容易耗尽系统资源,拖慢运行速度。)
var items = [1, 2, 3, 4, 5, 6];
var results = [];

function async (arg, callback) { //任务
  console.log('参数为 ' + arg + ' , 1秒后返回结果');
  setTimeout(function () {
    callback(arg * 2);
  }, 1000);
}

function final(value) { //任务列表完成后执行的函数
  console.log('完成: ', value);
}

items.forEach(function (item) { //遍历参数列表,一个参数代表一个任务,回调函数创建异步任务
  async (item, function (result) {
    results.push(result); //存放每次任务的结果
    if (results.length === items.length) { //当结果总数与参数总数相等则任务完成,调用final()
      final(results[results.length - 1]);
    }
  })
});

3,流程控制之串,并行结合

// 3,流程控制之串,并行结合(可以通过调节并行执行的最大任务数量来达到资源与效率的最佳平衡)
var items = [1, 2, 3, 4, 5, 6]; //所有任务的参数
var results = []; //每个任务存放结果的地方
var running = 0; //正在运行的任务数量
var limit = 2; //允许并行执行至多任务数量

function async (arg, callback) { //任务
  console.log('参数为 ' + arg + ' , 1秒后返回结果');
  setTimeout(function () {
    callback(arg * 2);
  }, 1000);
}

function final(value) { //任务列表完成后执行的函数
  console.log('完成: ', value);
}

function launcher() { //任务发射器(串,并行执行)
  while (running < limit && items.length > 0) {//利用循环来挂起异步任务,一次最多挂起 limit 次异步任务,有异步任务执行完成后递归launcher再次用此循环挂起异步任务
    var item = items.shift();//取出第一个参数并从参数列表中删除
    async (item, function (result) {
      results.push(result);//存入每次任务的结果
      running--;//正在运行的任务数量-1
      if (items.length > 0) {//如果参数列表还有参数则递归launcher()以开始另一个任务
        launcher();
      } else if (running == 0) {//正在运行的任务数量等于0时结束递归并调用final()
        final(results);
      }
    });
    running++;//正在运行的任务数量+1,注意:此行代码为同步任务内容会在异步任务async()前执行,因为同步任务结束后才会检查执行异步任务
  }
}

launcher(); //开启任务发射器

@沉木

声明式循环库ouro-loop:简化JavaScript异步流程控制与任务编排 在JavaScript异步编程中,循环与迭代是处理数据流和任务编排的基础。传统的命令式循环(如for、while)在处理异步操作、错误重试和并发控制时,常导致代码臃肿且难以维护。声明式编程范式通过分离“做什么”与“怎么做”,让代码意图更清晰、更易测试。ouro-loop作为一个现代JavaScript/TypeScript库,将这一理念应用于循环场景,提供了串行、并行、条件循环等模式,并内置了上下文管理、错误处理和生命周期钩子。其技术价值在于将复杂的流程控制(如指数退避重试、并行限流)模块化,显著提升代码可 阅读详情

相关推荐

服务器基础知识介绍

服务器,不仅仅是一台高性能计算机,更是网络的核心节点,承担着网络服务的责任。然而,相较于普通计算机,服务器对于稳定性、安全性和性能等方面提出了更高的要求,这使得它们在数字化浪潮中傲然独立。在硬件成本结构中,CPU和芯片组占据约50%的成本,内存占15%,外部存储占10%,其余硬件约占25%。服务器的逻辑结构与普通计算机相似,但由于其需要提供高性能计算,对稳定性、可靠性、安全性、可扩展性和可管理性的要求更高。服务器的分类多种多样,根据产品形式可分为塔式服务器、机架服务器、刀片服务器和机柜服务器。

m0_73576645的博客 1882

异步流程控制

单线程与异步Javascript是单线程运行、支持异步机制的语言。进入正题之前,我们有必要先理解这种运行方式。以「起床上班」的过程为例,假设有以下几个步骤:起床(10min)洗刷(10min)换衣(5min)叫车(10min)上班(15min)最简单粗暴的执行方式就是按顺序逐步执行,这样从起床到上班共需50分钟,效率较低。如果能在「洗刷」之前先「叫车」,就可以节省10分钟的等车时间。这样一来「叫车...

weixin_34268753的博客 252

车载摄像头+max96712 + rk3568 调试过程中遇到的问题

本文主要讲述本人在调试rk3568通过mipi-csi2链接max967812,max96712再外接4路车载摄像头过程中遇到的问题,以及最终如何解决这些问题。图中会贴上很多重要且关键的波形图,以便读者在调试过程中进行比对,分析。 如果在调试过程中,mipi总线上的波形没得什么问题的话,还是抓图失败的情况下,需要着重检查 频率,lane数,摄像头分辨率,摄像头输入图像格式等重要配置。

Amelio Ming 2066

JavaScript中的异步

JS异步编程、事件循环

weixin_43165676的博客 6638

【影像组学】用3Dslicer或Python提取影像组学特征

用3Dslicer或Python提取影像组学特征

abdslfwoeugp 1万+

基于MS5351的三通道可编程时钟发生器设计

时钟发生器是数字系统时序验证与信号完整性测试的核心基础设备,其原理基于锁相环(PLL)对参考晶振进行倍频与分频控制,通过寄存器配置实现多路独立频率输出。技术价值体现在高精度、低抖动、快速切换与工程可部署性之间取得平衡,尤其适用于FPGA/ASIC参考时钟调试、ADC/DAC采样时钟验证及嵌入式硬件时序裕量评估等场景。本方案采用MS5351三通道时钟芯片与ESP32主控协同架构,在保证LVCMOS输出质量与I²C可编程性的前提下,优化电源噪声抑制、晶体负载匹配和跨板信号完整性,兼顾成本、周期与实测稳定性,为实

weixin_31715353的博客 211

JS的异步任务

事件循环、同步任务、异步任务(主讲)

weixin_44922480的博客 781

从零开始学 PyTorch 7天路线图(完整可运行代码版)

本文提供了5天PyTorch入门教程的完整代码,涵盖从基础到实战的核心内容。Day1测试环境并介绍张量基础;Day2讲解常用张量操作;Day3演示自动求导机制;Day4实现完整线性回归模型;Day5构建MNIST手写数字识别全连接网络。所有代码可直接运行,包含GPU检测、梯度计算、模型训练和可视化等关键环节,帮助新手快速掌握PyTorch核心概念和典型应用场景。

IT老农民的博客 314

js异步任务

Promise(async/await) => Promise并不是完全的同步,在promise中是同步任务,执行resolve或者reject回调的时候,此时是异步操作,会先将then/catch等放到微任务队列。不进入主线程、而进入”任务队列”的任务,当主线程中的任务运行完了,才会从”任务队列”取出异步任务放入主线程执行。3、当主线程中的所有同步任务执行完毕,就会读取任务队列中的异步任务,按顺序取出异步任务放入主线程中执行。在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

m0_59070120的博客 565

【系统架构设计师】案例分析考点情况分析和解题技巧(包括2009~2024年考点详情)

复习方法建议仍然是以真题为主,只不过和综合题不同,标准答案并不会涵盖所有可能的考点。案例的考察方法和论文不太一样,它考察两大块的内容:

数据知道的博客 1万+

数据治理——详解元数据、资源目录、主数据、数据元、元数据管理、主数据管理【附全文阅读】

摘要:数据中心建设的核心是元数据管理,即"描述数据的数据",包含内容、质量、所有者等关键信息。元数据在数据仓库中记录数据源、转换规则等,是管理基础;主数据管理则确保核心业务数据的准确一致。二者共同构建高效的数据资源目录,为数据服务提供支撑。(99字)

cdfunlove的博客 101

详解JS的四种异步解决方案!

详解JS的四种异步解决方案!

chengbo_eva的博客 9248

Windows 下 Hermes Agent(爱马仕)安装全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Hermes Agent(爱马仕) 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Hermes Agent 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装WSL环境 2.2 步骤二 安装Python环境 2.3 步骤三 安装Hermes Agent 2.4 步骤四 修正 API Key 错误 2.5 步骤五 配置多个模型 2.6 步骤六 启动Hermes Agent 3. 常见问题及解决方案 4. 总结

weixin_43178406的博客 14万+

Bach.js 开源项目教程

Bach.js 开源项目教程 项目介绍 Bach.js 是一个用于组合和顺序执行异步任务的 JavaScript 库。它基于 Node.js 环境,旨在简化异步流程控制,特别是在构建复杂的任务序列时。Bach.js 提供了一种简洁的方式来管理任务依赖和执行顺序,使得代码更加清晰和易于维护。 项目快速启动 安装 首先,确保你已经安装了 Node.js 和 npm。然后,通过以下命令安装 Bach.j...

gitblog_01070的博客 754

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NodeJs实战第二章之异步任务的流程控制

这些任务彼此之间开始和结束的时间并不重 要,但在后续逻辑执行之前它们应该全部执行完。需要一个接一个执行的任务叫做串行任务。🟣 前端2026最新【持续更新】→。让一组异步任务顺序执行的概念被称为。不需要一个接着一个执行的任务叫作。流程控制分为两类:串行和并行。🟢 前端0到1【持续更新】→。🔵 前端进阶【持续更新】→。🔴 AI最新学习资料 →。

zhang1339435196的博客 525

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Contra.js并发控制实战:10个高效处理异步任务的技巧

你是否经常在JavaScript开发中遇到异步任务管理的挑战?😅 回调地狱、Promise链过长、并发控制复杂...这些问题让异步编程变得棘手。今天,我要为你介绍Contra.js——一个功能强大且轻量级的异步流程控制库,它能帮你优雅地解决这些问题!Contra.js提供了多种异步控制模式,让复杂的异步操作变得简单直观。 ## 📦 Contra.js是什么? Contra.js是一个专门为

gitblog_00102的博客 650

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JavaScript中的异步梳理(3)——使用Wind.js

在之前介绍的方法中,无论是消息驱动还是Promise,都无法摆脱“回调”这个东西。习惯了命令式编程的我们似乎很难接受回调,因为它的执行顺序和代码编写顺序并不一致。而JavaScript中的回调之所以会有这么多话题值得讨论,我想一方面是因为它有一张长得像Java的脸,而同时却又有如此多的异步特性。反观像Erlang, F#那样生来就是异步的语言,似乎反而没这么多话题好讨论的。异步就要回调吗...

baoaoba9317的博客 211

JS之异步探究

1. 单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待 注意,JavaScript 只在一个线程上运行,不代表 JavaScript 引擎只有一个线程。事实上,JavaScript 引擎有多个线程,单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合 JavaScript 之所以...

HAIYUANBOY的博客 224

Node.js 异步流程控制

Node.js 异步流程控制异步流程控制对象async 串行无关联:async.series 并行无关联:async.parallel 串行有关联:waterfall parallelLimit:parallelLimit函数和parallel类似,但是他多了一个参数limit limit参数限制任务只能同时并发一定数量,而不是无限制并发 首先我们需要安装async模块: 我们来看看同步的情况:f

C. 724

JavaScript个人总结-异步操作-异步操作概述

单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。注意,JavaScript 只在一个线程上运行,不代表 JavaScript 引擎只有一个线程。事实上,JavaScript 引擎有多个线程,单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合。JavaScript 之所以采用单线程,而不是多线程,跟历史有关系。

qq_31435455的博客 1420

【JavaScript 教程】异步操作——概述

作者|阮一峰1、单线程模型单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等...

web前端开发 328

异步编程概述

异步编程概述 1.JS单线程模型 单线程模型指的是, JavaScript只在一个线程上运行。(同时只能执行一个任务,其他任务必须排队等待) 注意,上述文字不代表JS引擎只有一个线程。事实上,JS引擎有多个线程,只是单个脚本只能在一个线程上运行(主线程),其他线程都是在后台配合。 JS使用单线程的原因 在设计之处,JS就是单线程的,原因是不想让浏览器渲染变得太复杂。 如果是JS有两个线程,其中一个线程是在网页中添加DOM节点,另一个线程则是在网页中删除该节点,那么该以谁为准呢? 所以,为了避免这种情况,JS

SSYLDBDSY的博客 408

JS异步操作:概述

目录 1. 单线程模型 什么是单线程模型 JS为什么采用单线程模式 单线程模式的优缺点 2. 同步任务 和 异步任务 3. 任务队列 和 事件循环 4. 单线程模型 回调函数 事件监听 发布/订阅 5. 单线程模型 串行执行 并行执行 并行和串行的结合 本文转载于:异步操作概述 (一)单线程模型 1. 什么是单线程模型? 单线程模型指:JavaScript 只在一个线程上运行。也就...

林夏天的博客 816

Step.js 使用教程(附源码解析)

Step.js(https://github.com/creationix/step)是控制流程工具(大小仅 150 行代码),解决回调嵌套层次过多等问题。适用于读文件、查询数据库等回调函数相互依赖,或者分别获取内容最后组合数据返回等应用情景。

zhangxin09的专栏 1万+

ztree 异步展开节点显示不出来_【JavaScript 教程】异步操作——概述

作者|阮一峰1、单线程模型单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。注意,JavaScript 只在一个线程上运行,不代表 JavaScript 引擎只有一个线程。事实上,JavaScript 引擎有多个线程,单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合。Jav...

weixin_39605347的博客 283

异步操作概述

异步操作概述网道(WangDoc.com),互联网文档计划【免费领取】廖雪峰老师历时三个月整理的《Vue 源码 + 3.0语法剖析教程》。目录 [隐藏] 单线程模型 同步任务和异步任务 任务队列和事件循环 异步操作的模式 回调函数 事件监听 发布/订阅 异步操作的流程控制 串行执行 并行执行 并行与串行的结合 单线程模型 # 单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。注意,JavaScrip

ln6833 958
上一篇: JS_模块的命名空间
下一篇: JS_console对象中的一些常用方法
浅香沉木
博客等级 码龄7年 32粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值