【JavaScript 异步编程】回调函数 | 回调地狱以及替代方案
1 概述回调函数就是作为一个函数的参数的函数在外部函数执行完毕的时候这个回调函数会在特定的时机执行。通常在同步或者异步的编程场景下要用到异步编程的时候可以用promise 或者 async/await 定时器setTimeout这些时间相关的api。回调地狱就是原生回调函数们不断嵌套嵌套嵌套像俄罗斯套娃一样虽然实现了按照一定顺序的输出但是由于层层嵌套难以维护不好调试和复用。这个时候避免回调地狱用的就是promise .then 看起来就是链式调用then 然后在这个基础上有一个async / await 语法糖 写起来更简洁看起来像同步编程的代码一样。这两种方式都避免了回调地狱代码复用性和可读性更好。2 回调函数简单来说回调函数就是一个被作为参数传递给另一个函数的函数并且这个被传递的函数在外部函数执行完毕后的某个时机被“回调”执行。回调函数是作为参数传递到另一个函数中然后在外部函数内调用以完成某种例行程序或操作的函数。JavaScript 回调函数 | 全栈开发回调函数 - MDN Web 文档术语表Web 相关术语的定义 | MDN你需要先定义doSomething函数或者使用已有的异步API如setTimeout、Promise等才能正常运行这段代码。WindowsetTimeout() 方法 - Web API | MDN如果你的doSomething是同步的let value 1; function doSomething(callback) { callback(); // 同步执行回调 } doSomething(() { value 2; }); console.log(value); // 输出: 2如果你的doSomething是异步的比如使用setTimeoutlet value 1; function doSomething(callback) { setTimeout(callback, 0); // 异步执行回调 } doSomething(() { value 2; }); console.log(value); // 输出: 1因为回调函数还没有执行最常见的实际例子let value 1; // 模拟异步操作 setTimeout(() { value 2; console.log(回调中:, value); // 最后输出: 回调中: 2 }, 0); console.log(当前:, value); // 先输出: 当前: 1关键点同步代码立即执行console.log会在回调函数执行后执行异步代码如setTimeout、Promise、fetch等会将回调放入事件队列等待主线程空闲时执行在异步情况下console.log会在回调函数执行前执行3 回调地狱Callback Hell一文告诉你什么是回调地狱如何解决回调地狱-CSDN博客虽然回调函数是处理异步的基础但在实际开发中如果存在多个相互依赖的异步操作就可能导致回调函数层层嵌套。每一层异步操作都需要在前一层操作的回调函数内部发起形成所谓的“回调地狱”Callback Hell或“毁灭金字塔”Pyramid of Doom。回调地狱呢回调函数里面一直嵌套回调函数类似于定时器里面一直嵌套setTimeout如果需要执行很多轮呢这么就是陷入了回调地狱代码可读性很差也不好维护 。例子定时器层层嵌套// 回调地狱版本定时器层层嵌套 setTimeout(() { console.log(1秒后执行第1个任务); setTimeout(() { console.log(再2秒后执行第2个任务); setTimeout(() { console.log(再3秒后执行第3个任务); setTimeout(() { console.log(再4秒后执行第4个任务); // ... 可以无限嵌套下去 }, 4000); }, 3000); }, 2000); }, 1000);多个异步操作嵌套// 用户注册流程的回调地狱 function registerUser(userData, callback) { validateUser(userData, (isValid) { if (isValid) { checkEmailExists(userData.email, (exists) { if (!exists) { createUser(userData, (userId) { sendWelcomeEmail(userId, (emailSent) { if (emailSent) { logActivity(userId, registered, (logged) { callback(null, { success: true, userId }); }); } else { callback(邮件发送失败); } }); }); } else { callback(邮箱已存在); } }); } else { callback(数据验证失败); } }); }解决办法promise then promise发出了以后then依次执行或者用async await 更简洁好复用 。// 伪代码示例回调地狱结构 asyncOperation1(data, function(result1) { asyncOperation2(result1, function(result2) { asyncOperation3(result2, function(result3) { // ... 更多嵌套 console.log(最终结果: , result3); }, failureCallback); }, failureCallback); }, failureCallback);这种代码结构可读性差难以维护和调试。为了解决这个问题JavaScript 社区发展出了更先进的异步处理方案。回调函数的替代方案随着 JavaScript 语言的发展出现了更优雅地处理异步操作的方式旨在解决回调地狱问题。其中最主要的是 Promises 和 Async/Await 语法。Promises 提供了一种链式调用的方式来组织异步操作使得代码结构更扁平化。4 Async/AwaitAsync/Await 是建立在 Promises 之上的语法糖它允许开发者用更接近同步代码的写法来处理异步逻辑极大地提高了代码的可读性和可维护性。尽管如此理解回调函数仍然是掌握这些高级概念的基础。async function声明创建一个绑定到给定名称的新异步函数。函数体内允许使用await关键字这使得我们可以更简洁地编写基于 promise 的异步代码并且避免了显式地配置 promise 链的需要。理解异步函数async和await的用法_async await用法-CSDN博客async function - JavaScript | MDN

相关新闻

基于边缘侧感知的移动机器人(AGV/AMR)自主乘梯逻辑设计与实现

基于边缘侧感知的移动机器人(AGV/AMR)自主乘梯逻辑设计与实现

摘要: 在智慧工厂的建设过程中,打通楼层间的垂直通行壁垒是实现全域自动化的核心环节。然而,面对协议封闭、环境恶劣的老旧货梯,传统的“协议破解”或“云端集中调度”模式往往面临稳定性差、施工风险高的难题。本文将结合 鲁邦通…

2026/7/4 20:53:00 阅读更多 →
计算机毕业设计springboot在线办公系统 基于Spring Boot框架的企业级在线办公平台开发与实现 Spring Boot驱动的现代化在线办公管理系统设计与构建

计算机毕业设计springboot在线办公系统 基于Spring Boot框架的企业级在线办公平台开发与实现 Spring Boot驱动的现代化在线办公管理系统设计与构建

计算机毕业设计springboot在线办公系统5ef459(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着信息技术的飞速发展,企业对高效、便捷的管理工具的需求日益增长。…

2026/7/3 17:00:28 阅读更多 →
LeetCode 385 迷你语法分析器

LeetCode 385 迷你语法分析器

文章目录摘要描述题解答案题解代码分析1. 特殊情况处理2. 使用栈来维护嵌套结构3. 数字解析4. 处理逗号和右括号5. 完整解析流程示例6. 边界情况处理示例测试及结果示例 1:单个整数示例 2:嵌套列表示例 3:包含负数示例 4:空列表示…

2026/7/3 17:00:33 阅读更多 →

最新新闻

终极解决方案:KMS智能激活脚本完整指南 - 彻底告别Windows和Office激活烦恼

终极解决方案:KMS智能激活脚本完整指南 - 彻底告别Windows和Office激活烦恼

终极解决方案:KMS智能激活脚本完整指南 - 彻底告别Windows和Office激活烦恼 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?…

2026/7/5 5:47:45 阅读更多 →
受够了记账 App 的广告和会员,我自己写了一个:完全免费、数据 100% 在本地、开源

受够了记账 App 的广告和会员,我自己写了一个:完全免费、数据 100% 在本地、开源

受够了记账 App 的广告和会员,我自己写了一个:完全免费、数据 100% 在本地、开源 先说结论:这是一个没有广告、没有会员、没有内购、不需要注册、不联网上传任何数据的记账 App。代码开源在 GitHub,Android 安装包直接从 Release…

2026/7/5 5:45:44 阅读更多 →
PyInstaller 打包 exe 图标不显示问题(AI生成)

PyInstaller 打包 exe 图标不显示问题(AI生成)

# PyInstaller 打包 exe 图标不显示?这篇文章帮你彻底解决!## 🔍 问题背景最近在用 PyInstaller 打包一个 PySide6 项目时,遇到了一个非常头疼的问题:**设置了图标但 exe 文件始终不显示**。经过一番折腾,终…

2026/7/5 5:45:44 阅读更多 →
知网查重太贵?2026年免费论文查重渠道汇总+PaperRed隐藏功能曝光

知网查重太贵?2026年免费论文查重渠道汇总+PaperRed隐藏功能曝光

2026年毕业季,知网查重一次要多少钱?答案是:本科论文约100-200元,硕博论文200-400元。而且很多学校只给1-2次免费查重机会,用完之后就得自费。对于预算有限的学生来说,这笔开销不算小。更让人头疼的是&…

2026/7/5 5:43:44 阅读更多 →
电机控制进阶——PID速度环参数整定实战与调优

电机控制进阶——PID速度环参数整定实战与调优

1. PID速度环控制基础概念 第一次接触电机PID控制时,我盯着那三条看似简单的曲线发愣——比例、积分、微分,这三个数学概念怎么就能让电机转速乖乖听话呢?后来在实验室熬了三个通宵才明白,PID控制就像教小朋友骑自行车&#xff1a…

2026/7/5 5:41:44 阅读更多 →
Meshroom完整指南:免费开源3D重建软件从入门到精通

Meshroom完整指南:免费开源3D重建软件从入门到精通

Meshroom完整指南:免费开源3D重建软件从入门到精通 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 你是否曾想过,能否将手机拍摄的普通照片变成逼真的3D模型&#xff1…

2026/7/5 5:41:44 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻