HarmonyOS APP开发-一文两表三实例讲清async函数与普通函数的区别-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利

VMware player桥接模式不能联网的解决方法 VMware虚拟机下主要使用两种网络连接方式:桥接模式、NAT模式。 桥接模式:查一下,虚拟机独立IP。 NAT模式:与电脑共享IP、需要映射应用服务的端口。 我的需求需要独立IP,于是使用桥接。 网络连接失败。 个人主机系统的网络设置: 设置 - 网络和 Internet - 更改适配器设置 给虚拟机设置网络适配器 只保留,点击确定,确定。 重新运行虚拟机。 ... 阅读详情

作为iOS的研发人员,转向鸿蒙平台,学习ArkTS时,对于在函数前面加async的理解一直是懵懵的。一直是当作可异步执行的函数。

但是,对于调用异步函数时,前面加 await的这种写法,该函数也必须是async就不太理解了。

本篇内容是《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书第四章内容的延续,是咱这本书读者的福利,在本篇内容中通过两张表格对比及三组示例说明在不同的场景中,async函数与普通函数的区别,每组示例可以独立的编译及调试,欢迎大家一同来深入的了解这两者,甚至可以当作面试题来学习。

   对本书感兴趣的同学可以点击以下链接进行购买,及参加 我的班级(华为官方)共同学习

​​​​​

读者福利

《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利博文目录,点击查看

核心区别速查表

参考多方的资料和代码实践,将个人的理解进行了整理。为了更好地理解,下面先在实现、执行、返回值、异常处理及调用等层面进行对比:

特性普通函数 (无 async)async 函数
实现约束不能使用 await 关键字可以使用 await 关键字来暂停执行
执行流程同步执行:从第一行执行到最后一行,不会中途暂停异步执行:遇到 await 会暂停,将线程控制权交还,直到等待的 Promise 解决
返回值直接返回一个明确的值(如 number, string, object 等)总是返回一个 Promise 对象
异常处理使用 try...catch 捕获同步错误使用 try...catch 捕获同步错误和 await 表达的 Promise 的拒绝(rejection)
调用方式直接使用变量接收返回值:const result = func()必须使用 .then()/.catch() 或 在另一个 async 函数中用 await 调用:const result = await func()

详细解释与代码示例

1. 返回值不同:Value vs. Promise
  • 普通函数:返回的就是 return 语句指定的值。

    // 函数定义
    function normalFunction() {
      return 58; // 直接返回数字 58
    }
    // 函数调用,result的值是58 (类型是 number)
    const result = normalFunction();
    
  • async 函数:无论你返回什么,它都会用一个 Promise 对象把你返回的值“包裹”起来。

    // 函数定义
    async function asyncFunction() {
      // 等价于 return Promise.resolve(58);
      return 58; 
    }
    // 函数调用,result的值是一个Promise类型(感兴趣的可以调试一下,还没找到方法通过log输出Promise实例)
    const result = asyncFunction();
    // 之后通过result获取返回值:
    result.then((value) => {
      // value: 58
      console.log("俩毛豆工具集:" + value);
    }); 
    // 上述代码也可以写成,这是不是就眼熟了
    asyncFunction().then((value) => {
      // value: 58
    }); 
    // 或者在另一个通过await 以同步的方式执行该异步函数
    // value 58
    const value = await asyncFunction();
    

    关于上述代码中,const result = asyncFunction(); // 函数调用,result的值是一个Promise类型(感兴趣的可以调试一下,还没找到方法通过log输出Promise实例),载图如下:

    执行Promise时,得到的结果为58,截图如下:

2. 执行流程不同:同步 vs. 可暂停的异步
  • 普通函数:执行是同步且连续的。函数体内的代码会一口气执行完毕,期间不会被打断(除非有异常)。它会阻塞后面代码的执行,直到自己完全跑完。

    // 同步函数,耗时约1秒
     function syncDelayOneSecond(): void {
       const startTime = new Date().getTime();
       let count = 0;
       // 通过空循环消耗CPU时间
       while (new Date().getTime() - startTime < 1000) {
         count++; // 空操作,仅用于消耗时间
       }
       console.log(`同步耗时完成,循环次数: ${count}`);
     }
    function normalFunction() {
      console.log('第一步');
       syncDelayOneSecond()
      console.log('第二步'); // 紧接着执行
    }
    console.log('开始');
    normalFunction();
    console.log('结束');

    上述的代码执行,Log输出,截图如下,注意一下左侧的时间列:

  • async 函数:执行是异步的。虽然它也会立即执行,但一旦遇到 await 关键字,它会暂停自己的执行,交出线程控制权,让事件循环(Event Loop)去执行其他代码(比如处理UI点击、网络响应等)。它会一直等到 await 后面的 Promise 变成“已解决”(fulfilled)或“已拒绝”(rejected)状态后,才恢复执行。

    // fetchData() 是一个返回 Promise 的函数,1秒后获取到数据
    async function fetchData() {
      const promise: Promise<number> = new Promise((resolve: Function, reject: Function) => {
        setTimeout(() => {
          resolve(88);
        }, 1000);
      })
      return promise;
    }
    async function asyncFunction() {
      console.log('第一步');
      let result = await asyncDelayOneSecond();
      console.log('第二步'); // 恢复执行
      return result;
    }
    console.log('开始');
    asyncFunction().then((value)=>{
      console.log("俩毛豆工具集:" + value);
    });
    console.log('结束');
    
    

    这种“暂停-恢复”的特性使得用同步代码的书写方式来处理异步操作成为可能,代码更清晰,避免了“回调地狱”(Callback Hell)。

  • 上述的代码执行,Log输出,截图如下,注意一下左侧的时间列,执行的顺序也与非async函数不同:

3. 错误处理
  • 普通函数:使用 try...catch 只能捕获同步错误。

    function normalFunction() {
      throw new Error('同步错误!');
    }
    
    try {
      normalFunction();
    } catch (error) {
      console.error('捕获到错误:', error); // 这里能捕获到
    }
    
  • async 函数:使用 try...catch 可以捕获同步错误和由 await 导致的 Promise 拒绝(rejection)。

    // asyncReject() 模拟返回一个被 reject 的 Promise
    async function asyncReject() {
      const promise: Promise<number> = new Promise((resolve: Function, reject: Function) => {
        setTimeout(() => {
          reject(new Error('错误!'));
        }, 1000);
      })
      return promise;
    }
    
    async function asyncFunction() {
      try {
        const data = await asyncReject(); // 当Promise 被 reject,会被 catch 住!
      } catch (error) {
        console.error('失败:', error); // 既能捕获 asyncReject 的失败,也能捕获函数体内异常
      }
    }
    
    asyncFunction();
    

    如果你不用 try...catch,也可以在调用时使用 .catch() 来捕获错误:

    async function asyncFunction_notry() {
      const data = await asyncReject(); // 当Promise 被 reject,上层可捕获
    }
    asyncFunction_notry().then(()=>{
            console.error("then");
          }).catch(()=>{
            console.error("catch");
          }).finally(()=>{
            console.error("finally");
          })
    

总结与如何选择

普通函数async 函数
使用场景执行简单的、同步的计算和操作。执行需要等待的操作,如:
1. 网络请求 (fetch, axios)
2. 文件读写
3. 定时器 (setTimeout 包装成 Promise)
4. 任何返回 Promise 的API
关键决策点你的操作是立即完成的吗?你的操作需要等待一段时间(如I/O)吗?
返回值值Promise实例

总结来说:加 async 的函数和普通函数最根本的区别在于返回值类型和内部是否允许使用 await。这导致了它们在执行流程和控制方式上的差异。当需要在函数内部进行异步操作(尤其是需要等待 Promise 的结果)时,就使用 async 函数并结合 await。否则,使用普通函数即可。

   对本书感兴趣的同学可以点击以下链接进行购买,及参加 我的班级(华为官方)共同学习

​​​​​

Ubuntu22.04中通过conda快速部署PyTorch开发环境(CPU/GPU双版本实战) 本文详细介绍了在Ubuntu22.04系统中,如何利用Conda高效部署PyTorch开发环境。文章分别提供了CPU与GPU双版本的实战教程,涵盖环境创建、镜像加速、版本匹配及深度验证等关键步骤,旨在帮助开发者快速搭建稳定、兼容的深度学习环境,从而专注于模型开发。 阅读详情

相关推荐

HTB Attacking GraphQL Skills Assessment

通过枚举应用,利用GraphQL API,发现sql注入点,然后利用找到flag。

qq_33522010的博客 449

《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利系列博文的目录

《精通HarmonyOS NEXT:鸿蒙App开发入门与项目化实战》已于9月8日开启预售,为读者提供系列配套博文作为学习福利。该书涵盖鸿蒙6适配、API变更、ArkTS语言特性、窗口管理、Web组件等核心开发内容,并按章节分类整理相关技术文章。同时提供共享库发布、签名配置等实战指南,配套京东、当当等官方购买渠道。通过系统化的教程和扩展资料,帮助开发者快速掌握鸿蒙应用开发技能,共建鸿蒙生态。

俩毛豆的博客 3180

WRF进阶:定制Vtable文件解析非标准气象数据源——以ERA5-Land土壤湿度为例

本文详细介绍了如何为WRF模式定制Vtable文件,以解析非标准气象数据源ERA5-Land的土壤湿度数据。通过剖析GRIB文件结构、详解Vtable编写逻辑与语法,并提供了从数据验证到metgrid配置的完整实战流程,帮助用户突破标准数据源限制,实现高精度陆面过程模拟。

o4p5q6r7s的博客 389

鸿蒙ArkTS异步开发:async函数与普通函数核心对比与实战

鸿蒙应用开发中,理解同步与异步的边界是写出流畅页面的前提。ArkTS基于单线程事件循环模型,普通函数同步执行可能阻塞后续逻辑,而async函数会立即返回Promise并异步执行函数体。这一机制直接决定了接口请求、文件读写和并发任务的执行顺序与性能表现。通过两张对比表和三组贴近业务的实例,本文清晰拆解了async函数与普通函数在语法、运行行为、错误传播和并发扩展上的本质差异,帮助开发者避开登录跳转、页面白屏、批量操作等常见陷阱。掌握这些区别,你就能在鸿蒙项目中准确选择异步边界,提升代码的可读性与响应速度。

weixin_29913663的博客 215

Pentaho安装与配置

Pentaho安装与配置前言一、下载二、配置1.JDK环境2.添加mysql-jdbc驱动三、启动 前言 Pentaho Data Integration (PDI):前身是Kettle。Pentaho提供了提取、转换和加载(ETL)功能,该功能使用统一且与最终用户和物联网技术相关且可访问的格式简化了捕获、清理和存储数据的过程。 功能:提供报表的制作、分析、仪表板、数据集成、数据采集、商业智能平台等强大功能。 一、下载 官网地址:http://www.pentaho.com/ 不过已经访问不到了

小太阳DENGJIE的博客 3581

嘉立创EDA实战:从点亮第一盏灯到完成首块PCB

本文详细介绍了使用嘉立创EDA从点亮第一盏LED灯到完成首块PCB的全过程。通过实战案例分享,包括原理图绘制、PCB设计、DRC检查、覆铜操作等关键步骤,帮助电子设计爱好者快速掌握嘉立创EDA的使用技巧,并避免常见的设计错误。

weixin_30314793的博客 368

手工银饰定制微距影像工坊:鸿蒙 Camera Kit 影随人动讲解跟拍与三档手动对焦落地

本文介绍了基于 HarmonyOS 的银器工坊应用,采用 ArkUI 声明式框架与 Camera Kit,实现影随人动跟拍与手动对焦功能,结合四 Tab 界面和深色主题,解决银饰拍摄中的跟拍与对焦痛点。

kathy_tan的博客 462

【一步到位】Android Studio 实现安卓连接阿里云物联网云平台

最新版本目前是Android Studio Iguana | 2024.1.2,你可以到官网上去找之前的版本,手上有工作项目的不要去轻易尝试,说不定你就编译失败了,失败了也不要担心,解决就可以了。

m0_73799445的博客 1万+

宠物敏捷训练跟拍——AUTO_FRAMING 构图追踪与手动对焦三档的鸿蒙协同方案

HarmonyOS 的 ArkUI 框架是华为面向全场景分布式应用打造的声明式 UI 开发体系。它以 、、、、 等一整套装饰器为语法骨架,让开发者用接近自然语言的方式声明界面的最终形态与状态绑定关系,再由框架的差分渲染引擎自动计算最小变更集合完成真实渲染。与传统命令式 UI 相比,声明式范式将"界面是什么"与"界面怎么变"彻底解耦——开发者只需描述任意时刻的界面快照,框架自动处理从旧状态到新状态的过渡。在宠物敏捷训练跟拍这类信息密度高、状态联动频繁的场景中,训练课程列表、相机会话状态、对焦记录时间线都需要实

kathy_tan的博客 102

nvidia系列教程-AGX-Orin系统刷机及备份

NVIDIA AGX Orin 是一款高性能的嵌入式计算平台,专为边缘计算和 AI 应用而设计。为了确保系统的稳定性和适应不同的应用场景,用户可能需要对 AGX Orin 进行系统刷机和备份操作。本文将详细介绍如何完成这些操作,帮助您更好地管理和维护 AGX Orin 设备。通过以上步骤,您可以成功地为 NVIDIA AGX Orin 刷写系统并创建备份。这些操作不仅能帮助您保持系统的更新和安全,还能在遇到问题时快速恢复系统。

flypig has a dream! 3321

高通蓝牙学习-- 关于Android 蓝牙的介绍

本文详细介绍了AOSP蓝牙架构及高通QCA芯片的蓝牙功能实现方案。主要内容包括:1)AOSP蓝牙架构在不同Android版本中的层次结构,重点分析BTHIDL层和libbt-vendor关键组件;2)QCA芯片的引导流程说明;3)两种获取libbt-vendor源码的方式(Google官方源和国内镜像源);4)针对QCA6595/6696/66x8/67x7芯片的具体实现方案,包括固件文件定义、厂商事件处理和补丁下载流程;5)蓝牙调试方法,包括logcat日志分析、HSU和Ellisys硬件跟踪技术。文章为

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 487

「肌龄镜界」美业皮肤近距检测——影随人动面部追踪与手动对焦微距采集的鸿蒙设计

在美业皮肤管理的真实业务场景里,“采集"从来不是一个孤立动作。一位顾客进店后,顾问需要先在档案台调出她的肤质档案,再引导她把脸放进检测仪的取景框,先拍全脸分区图,再贴近到面颊拍毛孔纹理图,最后回到档案台记录护理建议、约定复诊日期。这条业务链路的每一步,都对相机能力提出了截然不同的要求:全脸阶段要的是"面部永远居中”,近距阶段要的是"焦点精确落在 5 厘米处的毛孔层"。

kathy_tan的博客 487

分布式训练中All-Reduce、All-Gather、Reduce-Scatter原理

Reduce-Scatter = 先对所有进程的数据做 Reduce(如 sum / mean),再把结果“切分”分发给各进程。(是 Reduce + Scatter 的融合操作。

comli_cn的博客 332

影随人动 AUTO_FRAMING × 手动对焦三接口,让病叶近拍识别更跟手:望田识虫 · HarmonyOS 6.1.1 Camera Kit 智慧植保巡田实战

HarmonyOS 6.1.1 的 Camera Kit 为开发者带来了两个非常"贴地气"的新能力:一个是影随人动(AUTO_FRAMING),另一个是手动对焦三接口。前者属于控制中心(ControlCenter)效果类型家族,底层会在拍摄预览过程中自动做裁剪与缩放,让被摄主体始终停留在画面中央;后者则是在 PhotoSession 上新增的三个同步方法,允许开发者直接以数值方式操控镜头对焦距离。

kathy_tan的博客 82

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

uni-app x 插件生态开发指南:uni_modules 包管理、uts 插件与插件市场全解析

uni-app x 通过一套开放、兼容的插件系统,将前端组件、uts SDK、页面模板、项目模板与原生能力封装统一纳入官方插件市场与 `uni_modules` 包管理规范。本文以仓库 [docs/plugin/README.md](https://link.gitcode.com/i/115809dde2d50254fc76838962097dd7) 为骨架,结合 [uni_modules 规范

gitblog_00521的博客 240

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

美食博主入镜讲解不跑焦:鸿蒙 Camera Kit 影随人动与微距对焦在短视频创作中的协同设计

本文介绍基于HarmonyOS ArkUI的美食创作应用,采用声明式UI与Camera Kit实现双会话相机:VideoSession支持AUTO_FRAMING影随人动构图,PhotoSession支持手动对焦三接口;结合炭黑/辣椒红/柚黄深色主题,通过单页多Tab与弹窗层叠架构,解决博主入镜与微距拍摄兼得的痛点。

kathy_tan的博客 68

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HarmonyOS 6效果实现:搜索头+分类chips横滑+精选大卡轮播(双大卡)+双列课程网格

教育是人生最好的投资——一门 Python 全栈开发课能让你从零基础到独立开发项目,一门 UI/UX 设计课能让你从设计小白到独立交付作品,一门公务员考试冲刺班能让你在千军万马中脱颖而出,一门雅思 7 分速成攻略能让你顺利出国留学,一门基金定投课能让你学会资产配置实现财富增长,一门 ChatGPT 大模型应用开发课能让你站在 AI 时代的前沿。「多多教育培训」正是为这群渴望学习、追求成长的学习者打造的一站式教育培训电商社区应用:用户可以在课程 Tab 按 8 大分类(编程开发/设计创意/考证考公/外语学习/

qq63160596的博客 229

Web-Dev-For-Beginners 浏览器扩展第二课实战:调用 CO2 Signal API 并用 localStorage 记忆用户偏好

本课是微软《Web-Dev-For-Beginners》课程第 5 个模块(浏览器扩展项目)的第二部分,聚焦两个核心命题:如何让浏览器扩展真正"联网"——通过 HTTP 请求接入真实数据源(CO2 Signal API 的实时电网碳强度数据),以及如何让扩展"拥有记忆"——利用 Web Storage 中的 localStorage 在会话之间持久化用户偏好。通读并动手实践本文后,你将掌握一套可复

gitblog_00632的博客 384

fountain 基础模块 f_base 全指南:仓颉服务端开发的地基组件与核心 API 详解

f_base 是 fountain 开源工具库(仓颉语言)的**基础模块**,官方定位为"fountain 项目的基本模块,建议开发时无脑导入本包"(见 [f_base/README.md](https://link.gitcode.com/i/35f5a373212e3dd4d96114b6670daab5))。它聚合了异常、比较器、控制台交互、空集合、Iterator/Option/Resul

gitblog_00666的博客 602

安卓启动流程与期间核心组件工作原理

本文以实际工作中出现的启动相关各种千奇百怪的bug为钩子,讲解了安卓app冷启动过程中核心组件的工作原理,pms -> packageParser/androidmanifest.xml -> context -> ams -> application -> activity -> layoutInflater资源加载过程 -> wms /window/WM -> view与viewgroup绘制原理 -> 渲染阶段。理供解决问题的思路,看业务框架代码能看懂他们改的哪块源码,跟他们扯皮能扯赢

mix39的博客 330

开源鸿蒙平台 CMP 三方库「krumb」适配全流程

本文记录 krumb 在 OpenHarmony 平台的完整适配过程:在不修改 commonMain 代码、零 expect/actual、无新增源文件的前提下,将 Kotlin Multiplatform 通知引擎原样编译为 ohosArm64/x64 KLIB,通过 9 个 C ABI 接口与 ArkTS 桥接,实现优先级队列、Promise 模式、手势控制等全功能真机演示。

2501_94812263的博客 225

【化学实验室|19】HarmonyOS ArkTS 回归测试实战:覆盖启动、空数据、异常输入和重复点击

一个 HarmonyOS 工程里出现 src/test 、 ohosTest 和 Hypium 依赖,不代表核心功能已经受到测试保护。真正有效的回归用例必须能在需求变更后回答:冷启动是否恢复本地数据,空列表是否给出可理解反馈,未选择答案能否提交,连续点击会不会重复记分,参数运行期间是否还能被修改,收藏按钮是否误触整行导航。 本文基于 化学实验室 1.0.5 的真实 ArkTS 源码展开。工程已经依赖 @ohos/hypium 1.0.2

2401_84996024的博客 241

【鸿蒙优选三方库】@ohos/grpc:像调本地方法一样调远程服务

OH_TPC的博客 192

HarmonyOS 个推集成指南,新手教程

本文档介绍鸿蒙系统下个推推送SDK(GTSDK 1.0.9及以上)的集成与配置流程,涵盖自动/本地集成方式、权限及参数配置、SDK初始化、推送事件回调、通知点击与透传消息回执上报等关键步骤,并强调合规性要求。通过在EntryAbility中初始化SDK并配置module.json5文件,结合DevEco Studio 5.0.3.800以上版本及useNormalizedOHMUrl配置,完成推送功能验证。最终通过日志确认初始化成功并测试推送消息接收,实现完整推送链路。

小川搞开发的博客 434

端侧高斯泼溅(3DGS)渲染与性能调优初探:把“实景重建“跑在手机上【鸿蒙心迹】

端侧3D Gaussian Splatting受算力、带宽、显存、功耗制约,本文梳理渲染链路与核心机制,提供native渲染骨架代码,并总结5条调优实战策略:控量裁剪、分块LOD、半精度存储、异步加载、温控降帧,结合超分联动省带宽。强调“先稳帧率,再提画质”,助力鸿蒙空间计算中3DGS高效落地。

wdracky的专栏 189

开源鸿蒙平台 CMP 三方库「scroll-effects」适配全流程

本文完整记录 scroll-effect-lazy 库在 OpenHarmony 平台的适配过程,实现纯 Compose 物理内核(速度归一、弹性滞后、回弹弹簧)100% 逐字复用,并通过 Kotlin/Native 编译为 ohosArm64/ohosX64 动态库,经 C ABI/N-API 桥接驱动 ArkUI 列表逐帧平移。项目采用 cmp_qrose 构建模式,隔离 Android 工具链,零引入第三方依赖,真实验证物理计算在鸿蒙真机上的编译、链接与执行,实现“弹性滚动”手感的跨平台一致性。

2501_94452159的博客 249
上一篇: HarmonyOS APP开发-一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
下一篇: HarmonyOS APP开发-aboutToAppear中代码执行卡死来看async函数中的异常处理的必要性-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
俩毛豆
博客等级 码龄22年 348粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俩毛豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值