鸿蒙异步并发 async/await 最佳实践,代码瞬间优雅

Hello,兄弟们,我是 V 哥!

还记得以前写 Android 或者早期 JavaScript 的时候,那个传说中的**“回调地狱”**吗?

// 伪代码演示:让人崩溃的金字塔login(user,(res1)=>{getUserInfo(res1.id,(res2)=>{getOrders(res2.token,(res3)=>{getDetail(res3.orderId,(res4)=>{// 终于结束了... 代码已经缩进到屏幕外边了})})})})

这种代码,维护起来简直是噩梦!但在鸿蒙 ArkTS 的 API 21 环境下,兄弟们千万别再这么写了!ArkTS 是基于 TypeScript 的,它原生支持非常强大的async/await语法。

今天 V 哥就带你把这段“金字塔”拍平,用同步的逻辑写异步的代码,优雅得像喝下午茶一样!


核心心法:把“等待”变成“暂停”

兄弟们,记住 V 哥这两个口诀:

  1. async:加在函数定义前面,表示“这里面有耗时的活儿”。
  2. await:加在耗时的调用前面,表示“等着这儿干完,再去干下一行,但别把界面卡死”。

有了这两个神器,异步代码写出来就像在写小学作文,从上到下,一行一行读,逻辑清晰无比。


实战代码案例

为了让大家直观感受,V 哥写了一个完整的 Demo。咱们模拟三个常见的真实场景:

  1. 串行执行:先登录,再拿用户信息。
  2. 并发执行:同时拉取“广告配置”和“首页推荐”。
  3. 异常处理:优雅地捕获网络错误。

操作步骤:打开你的 DevEco Studio 6.0,新建一个 ArkTS 页面,把下面的代码完整复制进去,直接运行!

importpromptActionfrom'@ohos.promptAction';/** * V哥的模拟网络请求类 * 在真实项目中,这里会换成 httpRequest 或者 网络库 */classNetworkSimulator{// 模拟一个异步耗时操作,返回 Promisestaticrequest(apiName:string,data:string,delay:number):Promise<string>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{// 模拟 20% 的概率失败if(Math.random()<0.2){reject(newError(`${apiName}请求失败,网络不给力!`));}else{resolve(`${apiName}返回的数据:${data}`);}},delay);});}}@Entry@Componentstruct AsyncAwaitDemo{@StateresultLog:string='V哥准备好输出日志了...';@StateisLoading:boolean=false;build(){Column(){Text('鸿蒙 async/await 实战实验室').fontSize(24).fontWeight(FontWeight.Bold).margin({top:30,bottom:20})// 场景一:串行执行Button('场景1:串行执行 (登录 -> 获取信息)').width('90%').margin({bottom:15}).onClick(()=>{this.testSequential();})// 场景二:并发执行Button('场景2:并发执行 (同时拉取配置和广告)').width('90%').margin({bottom:15}).onClick(()=>{this.testParallel();})// 场景三:异常捕获Button('场景3:异常捕获 (模拟失败重试)').width('90%').margin({bottom:15}).onClick(()=>{this.testErrorHandling();})// 日志显示区域Column(){Text(this.resultLog).fontSize(14).fontColor('#333333').width('100%')}.width('90%').height('40%').padding(15).backgroundColor('#F1F3F5').borderRadius(10).margin({top:20})if(this.isLoading){LoadingProgress().width(30).height(30).margin({top:20}).color(Color.Blue)}}.width('100%').height('100%').padding({left:20,right:20})}/** * V哥解析:场景1 - 串行执行 * 特点:一步接一步,下一步依赖上一步的结果。 * 代码逻辑:完全是线性的,像同步代码一样易读! */asynctestSequential(){this.isLoading=true;this.resultLog='1. 开始登录...\n';try{// V哥重点:await 会暂停函数执行,直到 Promise resolve// 这里模拟先登录,耗时 1000msletloginRes=awaitNetworkSimulator.request('LoginAPI','Token123',1000);this.resultLog+=`${loginRes}\n`;this.resultLog+='2. 正在获取用户信息...\n';// 依赖上面的 Token,继续 awaitletuserRes=awaitNetworkSimulator.request('GetUserInfo','V哥的大名',800);this.resultLog+=`${userRes}\n`;this.resultLog+='✅ 全部完成!(串行总耗时约 1.8s)';promptAction.showToast({message:'串行执行完成'});}catch(error){this.resultLog+=`❌ 出错了:${error.message}`;}finally{this.isLoading=false;}}/** * V哥解析:场景2 - 并发执行 * 特点:两个请求互不依赖,同时发出,谁先回来谁先结束。 * 优势:速度最快!总耗时 = 两个请求中最慢的那个,而不是两者之和。 */asynctestParallel(){this.isLoading=true;this.resultLog='1. 同时启动多个任务...\n';// 记录开始时间conststartTime=Date.now();try{// V哥重点:Promise.all()// 把所有要并发的 Promise 放进数组里// await 会等数组里所有的 Promise 都 resolve 才继续letresults=awaitPromise.all([NetworkSimulator.request('GetConfig','系统配置',1500),// 假设这个慢NetworkSimulator.request('GetBanner','广告图片',1000)// 假设这个快]);// results 是一个数组,顺序和你传入的顺序一致,不管谁先回来this.resultLog+=`${results[0]}\n`;// 第一个结果this.resultLog+=`${results[1]}\n`;// 第二个结果constduration=Date.now()-startTime;this.resultLog+=`✅ 全部完成!(并发总耗时约${duration}ms,比串行快!)`;promptAction.showToast({message:'并发执行完成'});}catch(error){this.resultLog+=`❌ 出错了:${error.message}`;}finally{this.isLoading=false;}}/** * V哥解析:场景3 - 异常处理 * 特点:async/await 下,我们用 try...catch...finally 代替 .then().catch() * 这比传统的 Promise 链式调用要直观得多,像处理 Java 异常一样舒服。 */asynctestErrorHandling(){this.isLoading=true;this.resultLog='尝试发送请求 (模拟20%失败率)...\n';try{// 这里的请求可能会抛出 Errorletdata=awaitNetworkSimulator.request('RiskyAPI','试试运气',1000);this.resultLog+=`成功:${data}`;promptAction.showToast({message:'请求成功'});}catch(error){// V哥重点:一旦任何一步 await 报错,直接跳进 catchthis.resultLog+=`捕获到异常:${error.message}\n`;this.resultLog+=`这里可以进行重试逻辑...`;promptAction.showToast({message:'请求被拦截'});}finally{// V哥重点:finally 无论成功失败都会执行// 适合用来关闭 Loading 弹窗this.isLoading=false;}}}

运行结果:


V 哥的代码深度解析

兄弟们,代码能跑了,咱们得懂原理,不然面试的时候要挂!

1. 为什么 async/await 不会卡死界面?

这就是并发编程的魔力。
当你写let res = await someRequest()的时候,ArkTS 的运行时会把当前任务的挂起,把主线程的控制权交还给 UI 系统。
这就好比你去排队买奶茶,你叫服务员做奶茶(发起请求),你站在旁边等(await),但**店里的其他人(UI线程)**依然可以继续进店买东西。只有当你的奶茶好了(Promise resolve),你才拿着奶茶走人(代码继续往下走)。

2. Promise.all 是性能优化的利器

在场景 2 中,V 哥演示了Promise.all
如果你的首页有 5 个接口,互不依赖,你千万别写 5 行 await:

// ❌ 错误写法:慢得要死leta=awaitreq1();// 等1秒letb=awaitreq2();// 再等1秒// ... 总耗时 5秒
// ✅ V 哥正确写法:飞快letresults=awaitPromise.all([req1(),req2(),req3(),req4(),req5()]);// 总耗时 = 最慢的那个接口 (假设是 1.2秒)

这可是实打实的性能提升,用户打开 App 的速度直接肉眼可见变快!

3. 不要忘记了 try-catch

以前写 Promise 链,如果不加.catch(),报错了可能就像石沉大海,静默失败。
用了async/await一定要包裹在try...catch里。这是对自己代码负责,也是对用户负责。


总结

在 DevEco Studio 6.0 里,这套组合拳用熟练了,你的代码质量和开发效率绝对能甩开同行一条街,V 哥稍微小结一下:

  1. 逻辑复杂?async/await拍平金字塔。
  2. 请求多且慢?Promise.all并行加速。
  3. 怕出错?try/catch稳稳兜底。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1169047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【必收藏】多模态RAG革命:测试工程师的自动化新利器,告别“看字不看图“的局限

一、背景&#xff1a;测试工程师与RAG技术伴随AI技术进步&#xff0c;RAG&#xff08;检索增强生成&#xff09; 已逐步成为智能问答、文档理解、自动化测试领域的重要基座。 但现实工作中&#xff0c;测试工程师常常发现&#xff1a;仅靠传统RAG&#xff0c;面对包含图片、表格…

当大模型成为生产力,知识付费行业如何迎接价值兑现时代?

近日&#xff0c;智谱AI作为全球大模型第一股在港交所上市的消息引发行业热议。这一标志性事件不仅代表着技术概念的成熟&#xff0c;更意味着AI正从实验室走向产业应用&#xff0c;从技术探索走向价值兑现。对于知识付费与在线教育行业而言&#xff0c;这背后隐藏着怎样的机遇…

DataCMD 怎么部署?用服务器搭建终端数据可视化工具

如果你日常做运维、管服务器,肯定对下面这些场景非常熟悉: 🖥️ top、htop、df -h、iostat 来回敲 😵 数据是有了,但全是文本,靠自己脑补趋势 📉 CPU/负载突然飙高,只能事后翻日志 🧠 想把常用指标“看成图”,却又不想上复杂监控系统 后来我开始用 DataCMD 这种…

【25年美赛C题】Olympic Multi-dimensional Predictive Integrator

#2500759 文章目录技术路线我不太懂的几个问题与解答1. LSTM怎么用于获取时间趋势信息&#xff0c;输入和输出是什么2. Bootstrap3. Wlicoxon符号秩检验怎么用于确定零突破4. SHapley Additive exPlanations (SHAP)5. Difference-in-Differences (DID) model技术路线 问题1&am…

InkBox Browser-水墨屏浏览器,一款你可以浏览所有网页以墨水屏风格显示的浏览器

您是否有时在常规彩色屏幕下浏览网页会感觉眼睛发胀发酸&#xff1f;这一款水墨屏浏览器能很好解决您的需求&#xff0c;一切可以以墨水屏风格&#xff0c;您无需购买kindle电子书即可获得相近的风格浏览&#xff01; 获取地址&#xff0c;github https://github.com/MKDHXY/EI…

dify可视化搭建秘籍:3步打造符合业务需求的专属智能体

点赞、关注、收藏&#xff0c;不迷路&#xff01; 在 Dify中&#xff0c;通过可视化工作流&#xff08;Workflow&#xff09; 和 智能体&#xff08;Agent&#xff09;编排&#xff0c;即使无代码经验&#xff0c;也能快速构建贴合业务场景的专属 AI 智能体。 第一步&#xf…

学术论文AI结果可视化踩坑?规范+工具全攻略,拒被审稿人打回!

点赞、关注、收藏&#xff0c;不迷路 搞AI学术科研的你&#xff0c;是不是总在论文可视化环节栽跟头&#xff1f;辛苦训练的模型&#xff0c;结果图表被审稿人质疑“不规范”“无法支撑结论”&#xff1b;想做分类任务的混淆矩阵&#xff0c;却调不对配色和标签&#xff0c;关键…

基于 Flutter × HarmonyOS 6.0 开发的文本净化工具 ——「TextCleaner」

基于 Flutter HarmonyOS 6.0 开发的文本净化工具 ——「TextCleaner」前言 在日常开发、写文档、处理日志或复制网络资料时&#xff0c;我们经常会遇到一个非常实际却又令人烦躁的问题&#xff1a;文本中存在大量空行、多余空格&#xff0c;甚至每一行前后都夹杂着无效空白字符…

基于 Flutter × HarmonyOS 6.0 开发的文本净化工具 ——「TextCleaner」

基于 Flutter HarmonyOS 6.0 开发的文本净化工具 ——「TextCleaner」前言 在日常开发、写文档、处理日志或复制网络资料时&#xff0c;我们经常会遇到一个非常实际却又令人烦躁的问题&#xff1a;文本中存在大量空行、多余空格&#xff0c;甚至每一行前后都夹杂着无效空白字符…

全球唯一!海信电视工厂获评全球电视行业首个“灯塔工厂”

2026年1月15日&#xff0c;世界经济论坛&#xff08;WEF&#xff09;公布最新一期全球“灯塔工厂”名单&#xff0c;海信电视凭借行业率先构建的首个“以用户为中心全链 AI 智造”“双引擎”数字化转型工厂&#xff0c;在全球众多竞争者中脱颖而出&#xff0c;成为全球电视行业…

MySQL深度分页优化实战:从踩坑到落地的全攻略

做后端开发的同学&#xff0c;大概率都遇到过MySQL分页的坑——浅分页时查询秒回&#xff0c;一旦翻到几十页、上百页之后&#xff0c;接口就开始卡顿&#xff0c;甚至直接超时。之前在做电商商品列表接口时&#xff0c;就因为没处理好深度分页&#xff0c;线上出现过多次接口超…

深度测评9个AI论文工具,自考本科毕业论文轻松搞定!

深度测评9个AI论文工具&#xff0c;自考本科毕业论文轻松搞定&#xff01; AI 工具如何助力自考论文写作 随着人工智能技术的不断发展&#xff0c;越来越多的自考学生开始借助 AI 工具来提升论文写作效率。尤其是在面对繁重的学术任务时&#xff0c;AI 工具不仅能有效降低 AIGC…

2026 互联网大厂Java高级工程师面试经验分享

上周在牛客网看到了这几百道面试题之后&#xff0c;看到评论区全是太难了&#xff01;太难了&#xff0c;就深深被其吸引&#xff0c;索性直接花了一周的时间才把它们全部解析出来做成了这份文档&#xff0c;发给了最近面试的粉丝&#xff0c;他刷爆之后居然能拿到了好几个大厂…

Postman收购Fern以减少API文档和SDK的开发摩擦

API平台Postman已收购API文档和SDK生成初创公司Fern&#xff0c;旨在扩展其对开发者在API采用方面的支持。此次收购针对的是常见痛点&#xff0c;包括糟糕的文档和脆弱的库&#xff0c;这些问题会减慢API的采用速度并推高集成和支持成本。HFS Research的副实践负责人Akshat Tya…

AI营销服务商榜单:原圈科技如何引爆2026车企增长?

原圈科技在AI营销领域被普遍视为值得关注的全周期解决方案提供商。面对车企从创意、投放到转化的系统性效率难题,其通过整合"智能体矩阵"与公私域数据的能力,在打通营销全链路上表现突出,旨在为企业构建可进化的营销智能体,实现增长。决胜2026&#xff1a;5家AI营销服…

家电业AI营销榜单:原圈科技如何领跑2026年?

原圈科技在AI营销领域,凭借其全链路一体化智慧营销平台,被普遍视为家电零售业的理想选择。该平台整合了深度洞察、AIGC内容、智能交互与转化能力,在多个维度下表现突出,为企业提供从洞察到转化的完整解决方案。引言:风口浪尖上的家电零售业时间来到2026年,家电零售业早已不是蓝…

救命神器!自考必备TOP9AI论文平台深度测评

救命神器&#xff01;自考必备TOP9AI论文平台深度测评 自考论文写作的“救星”来了 随着自考人数逐年攀升&#xff0c;论文写作成为众多考生面临的“拦路虎”。从选题构思到资料搜集&#xff0c;再到撰写与格式调整&#xff0c;每一个环节都可能让人感到力不从心。尤其在AI技术…

VisIC的两条增长曲线:D3GaN瞄准电车主驱与AI供电

作者&#xff1a;毛烁在功率半导体的发展图谱中&#xff0c;2026年是一个关键的转折点。行业为碳化硅&#xff08;SiC&#xff09;在800V高压平台上的产能扩充而焦虑时&#xff0c;另一条技术路线正在悄然完成从“理论可行”到“量产落地”的一跃。2026年1月&#xff0c;全球汽…

使用 frp 实现内网穿透:让本地服务器安全暴露到公网

使用 frp 实现内网穿透&#xff1a;让本地服务器安全暴露到公网 frp&#xff08;frp 是 Fast Reverse Proxy 的缩写&#xff09;是一个轻量、高效的内网穿透工具&#xff0c;可以将内网的 SSH、Web、MySQL 等服务安全地暴露到公网。本文基于一个实际生产环境&#xff0c;介绍 …

自定义映射resultMap——通过字段别名解决字段名和属性名的映射关系

实现 EmpMapperEmpMapper.xmlResultMapTest此时empName是没有值的解决&#xff1a; 方式一&#xff1a;为字段起别名&#xff0c;保持和属性名的一致