news 2026/4/21 1:18:22

JavaScript异步编程怎么入门和实践?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript异步编程怎么入门和实践?

JavaScript 异步编程

异步的概念

异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。

在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。而异步的概念则是不保证同步的概念,也就是说,一个异步过程的执行将不再与原有的序列有顺序关系。

简单来理解就是:同步按你的代码顺序执行,异步不按照代码顺序执行,异步的执行效率更高。

以上是关于异步的概念的解释,接下来我们通俗地解释一下异步:异步就是从主线程发射一个子线程来完成任务。

什么时候用异步编程

在前端编程中(甚至后端有时也是这样),我们在处理一些简短、快速的操作时,例如计算 1 + 1 的结果,往往在主线程中就可以完成。主线程作为一个线程,不能够同时接受多方面的请求。所以,当一个事件没有结束时,界面将无法处理其他请求。

现在有一个按钮,如果我们设置它的 onclick 事件为一个死循环,那么当这个按钮按下,整个网页将失去响应。

为了避免这种情况的发生,我们常常用子线程来完成一些可能消耗时间足够长以至于被用户察觉的事情,比如读取一个大文件或者发出一个网络请求。因为子线程独立于主线程,所以即使出现阻塞也不会影响主线程的运行。但是子线程有一个局限:一旦发射了以后就会与主线程失去同步,我们无法确定它的结束,如果结束之后需要处理一些事情,比如处理来自服务器的信息,我们是无法将它合并到主线程中去的。

为了解决这个问题,JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理。

回调函数

回调函数就是一个函数,它是在我们启动一个异步任务的时候就告诉它:等你完成了这个任务之后要干什么。这样一来主线程几乎不用关心异步任务的状态了,他自己会善始善终。

实例

function print() { document.getElementById("demo").innerHTML="!"; } setTimeout(print, 3000);


尝试一下 »

这段程序中的 setTimeout 就是一个消耗时间较长(3 秒)的过程,它的第一个参数是个回调函数,第二个参数是毫秒数,这个函数执行之后会产生一个子线程,子线程会等待 3 秒,然后执行回调函数 "print",在命令行输出 "!"。

当然,JavaScript 语法十分友好,我们不必单独定义一个函数 print ,我们常常将上面的程序写成:

实例

setTimeout(function () { document.getElementById("demo").innerHTML="!"; }, 3000);


尝试一下 »

注意:既然 setTimeout 会在子线程中等待 3 秒,在 setTimeout 函数执行之后主线程并没有停止,所以:

实例

setTimeout(function () { document.getElementById("demo1").innerHTML="-1!"; // 三秒后子线程执行 }, 3000); document.getElementById("demo2").innerHTML="-2!"; // 主线程先执行


尝试一下 »

这段程序的执行结果是:

-1! // 三秒后子线程执行 -2! // 主线程先执行

异步 AJAX

除了 setTimeout 函数以外,异步回调广泛应用于 AJAX 编程。有关于 AJAX 详细请参见:https://www.example.com

XMLHttpRequest 常常用于请求来自远程服务器上的 XML 或 JSON 数据。一个标准的 XMLHttpRequest 对象往往包含多个回调:

实例

var xhr = new XMLHttpRequest(); xhr.onload = function () { // 输出接收到的文字数据 document.getElementById("demo").innerHTML=xhr.responseText; } xhr.onerror = function () { document.getElementById("demo").innerHTML="请求出错"; } // 发送异步 GET 请求 xhr.open("GET", "https://www.example.com", true); xhr.send();


尝试一下 »

XMLHttpRequest 的 onload 和 onerror 属性都是函数,分别在它请求成功和请求失败时被调用。如果你使用完整的 jQuery 库,也可以更加优雅的使用异步 AJAX:

实例

$.get("https://www.example.com",function(data,status){ alert("数据: " + data + "\n状态: " + status); });

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 1:17:32

旋转导向(RSS)可能是钻井领域最重要的技术

借助旋转导向系统(RSS)技术,能够以极低的风险钻探更为复杂的全域井眼轨迹。结合更高的钻井效率,最终结果是显著降低单井成本。RSS技术能够适应最广泛的钻井环境,同时保证最高质量的井眼质量。推靠式RSS通过改变钻头上的…

作者头像 李华
网站建设 2026/4/21 1:16:18

基于YOLO26的六类犬种识别检测系统:mAP50达到0.895,推理速度2.4ms/张(项目源码+数据集+模型权重+UI界面+python+深度学习+远程环境部署)

摘要 本系统基于YOLO26目标检测算法,构建了一个面向六类常见犬种的智能识别检测模型。研究涵盖Beagle、bullDog、corgi、goldenRetriever、husky和pomeranian六个犬种类别,总数据集规模为1257张标注图像,其中训练集880张、验证集251张、测试…

作者头像 李华
网站建设 2026/4/21 1:10:54

彩色标签打印机-RFID标签

重塑半导体彩色标签打印新模式半导体企业传统标签打印多依赖预印标 套打,不仅需提前备货大量预印标签,占用库存成本,遇到客户规格变更、小批量多批次生产时,易造成标签浪费,且彩色标识只能依赖预印,灵活性…

作者头像 李华
网站建设 2026/4/21 1:10:23

别再一张张画ROC曲线了!用Python的sklearn和matplotlib一键生成多模型对比图

高效对比机器学习模型性能:Python自动化绘制多模型ROC曲线实战 在机器学习项目汇报或论文撰写过程中,模型性能的可视化呈现往往决定着沟通效率。想象一下这样的场景:你刚完成五个不同算法的实验比较,导师突然要求两小时后展示结果…

作者头像 李华
网站建设 2026/4/21 1:04:27

微信聊天记录永久保存完全指南:3步掌握WeChatMsg高效导出技巧

微信聊天记录永久保存完全指南:3步掌握WeChatMsg高效导出技巧 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/w…

作者头像 李华