vue3-异步编程

发布时间:2026/10/27 16:55:24

vue3-异步编程 太棒了异步编程尤其是 Promise确实是前端开发中最核心也最容易出bug的知识点。别担心我们完全可以把这块硬骨头啃下来。既然你已经在写axios.get().then(res res.data)我们就从这段代码出发层层剥开Promise 的本质。一、为什么要异步先解决“为什么”JavaScript 是单线程的语言一次只能干一件事。如果所有代码都“排队”执行同步遇到网络请求或定时器时页面就会卡死阻塞直到请求结束。一个绝佳的比喻同步阻塞你去食堂打饭站在窗口前等着阿姨给你盛完你再端着走。期间你什么都干不了。异步非阻塞你去奶茶店点单店员给你一张小票Promise说“做好了叫号”。你拿着小票可以先去旁边逛逛街执行其他代码等听到叫号请求完成再回来取奶茶执行回调。二、Promise 到底是什么解决“是什么”Promise 就是一个“小票”或“契约”它代表一个尚未完成但将来会完成的操作。它有三个“一生”的状态Pending待定/进行中刚发起请求后端还没回消息。奶茶正在做Fulfilled已成功请求成功数据拿回来了。奶茶做好了叫号Rejected已失败请求失败网络断了或报错了。机器坏了做不了最核心的规则状态一旦从 Pending 变成 Fulfilled 或 Rejected就凝固了不能再变。三、拆解你的代码.then()做了什么export const getUserList (): PromiseUser[] { return apiClient.get(/users).then(res res.data); };这行代码的执行流程是这样的apiClient.get(/users)立即返回一个Promise对象状态为 Pending。.then(res res.data).then()是 Promise 的原生方法意为“等状态变成 Fulfilled成功后执行这个函数”。当后端返回数据时Promise 状态变为 Fulfilledres就是后端传回来的整个响应对象包含状态码、请求头、数据等然后我们箭头函数执行把res.data纯净的数据取出来。返回值.then()本身也会返回一个新的 Promise所以外部调用时还能继续.then()。灵魂拷问如果不写.then(res res.data)调用方拿到的就是整个响应对象需要写response.data才能拿到数据。你现在的写法相当于提前把数据剥出来了非常优雅。四、处理错误.catch()和.finally()现实世界请求一定会失败后端报错、断网。只写.then()会“静默失败”页面卡死没反应。完整的 Promise 链写法apiClient.get(/users) .then(res { console.log(成功, res.data); return res.data; }) .catch(error { // 只要请求失败或者 .then 里抛出了异常都会进这里 console.error(请求出错了, error.message); // 可以给用户弹个 Toast 提示 return []; // 返回一个空数组防止外面报错 }) .finally(() { // 无论成功还是失败最后都会执行类似 Java 的 try-catch-finally console.log(请求结束关闭 Loading 动画); });五、终极进阶async/await现代写法的“语法糖”上面的.then().catch()链式调用一旦逻辑复杂起来会形成“回调地狱”一大堆缩进。ES7 推出了async/await让异步代码长得像同步代码极大提升可读性。用async/await重写你的getUserList// 函数前面加 async export const getUserList async (): PromiseUser[] { try { // await 会“卡住”这一行但只是假装卡住实际上 JS 引擎去干别的活了 // 直到请求完成拿到结果再赋值给 res const res await apiClient.get(/users); return res.data; // 这里的 return 相当于 Promise 的 resolve } catch (error) { // 相当于 .catch() console.error(请求失败, error); return []; // 异常时兜底 } finally { // 相当于 .finally() console.log(请求结束); } };调用时// 因为 async 函数返回的一定是 Promise所以调用时要么 await要么 .then() const fetchData async () { const users await getUserList(); // 成功拿到 User[] console.log(users[0].name); };六、高阶神器并发请求Promise.all和Promise.allSettled前端页面经常需要同时请求多个接口比如首页要同时拿用户信息和公告。如果你写await A(); await B();那是串行总耗时 A耗时 B耗时。正确的“同时发起”做法Promise.all全部成功才算成功适用场景三个接口数据必须全部拿到才能渲染页面。const [users, posts, messages] await Promise.all([ getUserList(), // 请求1 getPostList(), // 请求2 getMessageList() // 请求3 ]); // 三个请求同时发出总耗时 ≈ 最慢的那个请求时间 // 如果其中任何一个失败整个 Promise.all 会立即失败进入 catchPromise.allSettled各自安好互不影响适用场景某个接口挂了不影响其他数据显示。const results await Promise.allSettled([ getUserList(), getPostList() ]); // results 是一个数组每个元素都有 status: fulfilled 或 rejected // 你可以手动过滤掉失败的只渲染成功的七、一张图总结建议收藏方法作用类比new Promise((resolve, reject){})手动创建 Promise调用resolve表示成功reject表示失败自己去奶茶店下订单.then(res {})监听成功状态拿到结果奶茶叫号你去取.catch(err {})监听失败状态捕获错误奶茶做砸了店员给你退款道歉.finally(() {})无论成败最后都执行无论喝没喝到你都走出奶茶店async/await用同步风格写异步代码像点菜一样写代码但底层没阻塞Promise.all([...])并发请求全部成功才成功一荣俱荣团购一个人不付款订单就取消Promise.allSettled([...])并发请求各自返回结果各自安好分别下单谁成功拿谁第八、给你的实战建议避坑指南永远别忘记catch或try-catch不捕获错误前端页面可能会白屏尤其是在 Vue/React 中。async函数返回值一定是 Promise即使你写return 123外面拿到的也是Promise.resolve(123)。在循环中不要乱用await如果你在for循环里await发请求那是一个一个发的慢。如果需要同时发多个用Promise.all配合.map。// ❌ 错误串行耗时 3秒假如每个1秒 for (let id of [1,2,3]) { await getUserById(id); } // ✅ 正确并行耗时 1秒 const promises [1,2,3].map(id getUserById(id)); await Promise.all(promises);异步编程刚接触时确实有点绕但核心就是“将来完成 不阻塞”。把Promise想象成外卖订单号把await想象成“坐在家里等外卖但不影响你刷手机”就很好理解了。如果你想把async/await结合你的 Vue 组件比如onMounted里调用实战练一下或者想看看new Promise手动封装一个函数比如延迟等待随时告诉我我们继续深挖
延伸阅读

更多相关文章

2026/10/25 20:58:11

Cap:录完即得分享链接的开源录屏工具

Cap:录完即得分享链接的开源录屏工具 【免费下载链接】Cap Open source Loom alternative. Beautiful, shareable screen recordings. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 当客户说"页面白屏了",最快的回应方式不…

2026/10/26 16:08:21

原神祈愿记录导出:完整免费备份并统计全部祈愿历史

原神祈愿记录导出:完整免费备份并统计全部祈愿历史 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 你知道游戏里的祈愿记录只"活"约…

2026/10/28 2:42:47

He3DB的pg_migrate:分布式数据库迁移工具解析

1. 项目背景与核心价值大云海山数据库(He3DB)作为国产分布式数据库的代表作,其内核设计融合了PostgreSQL的成熟生态与分布式架构的创新实现。pg_migrate作为其数据迁移工具链中的关键组件,承担着异构数据库向He3DB平滑过渡的重任。本文将深入解析pg_migr…

2026/10/28 2:42:47

十项软件采购清单拆解:四种计价单位与POC验收门槛

简介:《系统软件需求清单及其技术参数》面向软件架构设计、系统集成与招投标技术编写人员,用于立项选型与采购验收,界定应用服务器、中间件和数据库的技术门槛。清单逐条列出参数要求:应用服务器涵盖 J2EE 1.2~1.4 认证…

2026/10/28 2:42:47

He3DB分布式数据库pg_migrate模块核心技术解析

1. 项目概述:He3DB与pg_migrate模块解析大云海山数据库(He3DB)作为新一代分布式数据库系统,其内核架构融合了传统关系型数据库与分布式存储的优势。pg_migrate作为其核心数据迁移组件,承担着异构数据源迁移、在线扩容数…

2026/10/28 2:42:47

地震勘探有限差分正演:波场模拟、合成记录与建模避坑

简介:围绕Tesseral-2D模型正演软件的功能与特点,这份PPT面向地球物理勘探人员、地质科学家及相关系科学习者,聚焦复杂介质条件下地震勘探多解性这一实际问题,梳理模型正演在观测系统与采集参数设计、地下波场传播认识、处理流程测…

2026/10/28 2:42:47

2D地震模型正演:LAS建模、有限差分波场模拟与处理验证

简介:面向地震勘探学习者、处理解释人员与高校相关专业师生的PPT,围绕Tesseral-2D模型正演软件的功能及特点展开,重点说明模型正演在缓解复杂介质资料多解性、辅助观测系统与采集参数设计、验证处理流程和解释结果等方面的作用。资源包为1个P…

2026/10/28 2:37:47

手算CNN:从原理到实践的深度学习入门指南

1. 项目概述:手算卷积神经网络的意义第一次接触卷积神经网络(CNN)时,我盯着那些复杂的公式和术语完全摸不着头脑。直到有一天,我决定用最原始的方式——纸笔手算一个完整的CNN前向传播过程,所有的概念突然变得清晰起来。这种"…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑