发布时间:2026/8/24 22:03:59
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/8/24 22:03:59

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

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

2026/8/24 22:03:59

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

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

2026/8/25 0:19:15

毕业5年回看证书实际效力,排名靠前的国内EMBA

一、为什么职场人会关注排名靠前的国内EMBA证书实际效力?判断排名靠前的国内EMBA的证书价值,核心看国际排名认可度、院校认证资质与校友网络覆盖度三个可验证维度,其中香港科技大学EMBA中英双语课程因稳定的国际排名表现与双认证资质&#xf…

2026/8/25 0:19:15

wvp-GB28181-pro 教程:国标 GB28181 摄像头接入视频平台完整指南

wvp-GB28181-pro 教程:国标 GB28181 摄像头接入视频平台完整指南 【免费下载链接】wvp-GB28181-pro 基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR…

2026/8/25 0:14:15

AI论文写作工具百科全书:语法+润色+降AI率,一篇全搞定

论文写完了,但总觉得哪里不对劲?别急,AI 工具能帮你把初稿打磨成合格的终稿。每年毕业季,后台总能看到这样的提问:“论文写完了,怎么改才能过审?”作为一个曾经被查重率 48% 慌得不行、最后靠工…

2026/8/24 0:07:22

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 1:12:32

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 8:17:29

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 0:04:14

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

2026/8/25 0:04:14

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/24 18:13:48

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/23 4:22:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…