ArkTS 异步并发

发布时间:2026/11/5 15:40:27

ArkTS 异步并发 Promise 和 async/await 是标准的 JS 异步语法提供异步并发能力。异步代码执行时会被挂起在异步操作完成后恢复执行确保同一时间只有一段代码在运行。以下是典型的异步并发使用场景I/O 非阻塞操作网络请求、文件读写、定时器等。任务轻量且无 CPU 阻塞单次任务执行时间短。逻辑依赖清晰任务有明确的顺序或并行关系。异步并发是一种编程语言的特性允许程序在执行某些操作时不必等待其完成可以继续执行其他异步代码。PromisePromise 是一种用于处理异步操作的对象可将异步操作转换为类似同步操作的风格便于代码编写和维护。Promise 通过状态机制管理异步操作的不同阶段有三种状态pending进行中、fulfilled已完成也叫 resolved和rejected已拒绝。创建后处于 pending 状态异步操作完成后转换为 fulfilled 或 rejected 状态。Promise 提供了 then、catch、finally 方法来注册回调函数以处理异步操作的成功或失败结果。当 Promise 状态改变时回调函数会被加入微任务队列等待执行依赖事件循环机制在宏任务执行完成后优先执行微任务从而保证回调函数的异步调度。最基本的用法是通过构造函数实例化一个 Promise 对象传入一个带有两个参数的函数称为 executor 函数。executor 函数接收两个参数resolve 和 reject分别表示异步操作成功和失败时的回调函数。例如以下代码创建了一个 Promise 对象并模拟了一个异步操作const promise: Promisenumber new Promise((resolve: Function, reject: Function) { setTimeout(() { const randomNumber: number Math.random(); if (randomNumber 0.5) { resolve(randomNumber); } else { reject(new Error(Random number is too small)); } }, 1000); })在上述代码中setTimeout 函数模拟了一个异步操作1 秒后生成一个随机数。如果随机数大于 0.5调用 resolve 回调函数并传递该随机数否则调用 reject 回调函数并传递一个错误对象。Promise 对象创建后可以使用 then 方法和 catch 方法指定 fulfilled 状态和 rejected 状态的回调函数。then 方法可接受两个参数一个处理 fulfilled 状态的函数另一个处理 rejected 状态的函数。只传一个参数则表示当 Promise 对象状态变为 fulfilled 时then 方法会自动调用这个回调函数并将 Promise 对象的结果作为参数传递给它。使用 catch 方法注册一个回调函数用于处理“失败”的结果即捕获 Promise 的状态改变为 rejected 状态或操作失败抛出的异常。Promise 还可以使用 finally 注册回调函数无论 Promise 最终状态如何fulfilled 或 rejected都会执行该回调函数。例如import { BusinessError } from kit.BasicServicesKit; // ... /* * Promise 对象创建后可以使用 then 方法和 catch 方法指定 fulfilled 状态和 rejected 状态的回调函数。 * then 方法可接受两个参数一个处理 fulfilled 状态的函数另一个处理 rejected 状态的函数。 * * 只传一个参数则表示当 Promise 对象状态变为 fulfilled 时then 方法会自动调用这个回调函数并将 Promise 对象的结果作为参数传递给它。 * 使用 catch 方法注册一个回调函数用于处理“失败”的结果即捕获 Promise 的状态改变为 rejected 状态或操作失败抛出的异常。 */ // 使用 then 方法定义成功和失败的回调 promise.then((result: number) { console.info(Succeeded in getting number, number is ${result}); // 成功时执行 }, (error: BusinessError) { console.error(error.message); // 失败时执行 } ); // 使用 then 方法定义成功的回调catch 方法定义失败的回调 promise.then((result: number) { console.info(Succeeded in getting number, number is ${result}); // 成功时执行 }).catch((error: BusinessError) { console.error(error.message); // 失败时执行 });在上述代码中then 方法的回调函数接收 Promise 对象的成功结果并输出至控制台。如果 Promise 对象进入 rejected 状态catch 方法的回调函数接收错误对象并输出至控制台。当 Promise 被 reject 且未通过 catch 方法处理时会触发 globalUnhandledRejectionDetected 事件。可使用 errorManager.on(‘globalUnhandledRejectionDetected’) 接口监听该事件以全局捕获未处理的 Promise reject。async/awaitasync/await 是用于处理异步操作的 Promise 语法糖使编写异步代码更加简单和易读。使用 async 关键字声明异步函数并使用 await 关键字等待 Promise 的解析fulfilled 或 rejected以同步方式编写异步操作的代码。async 函数返回 Promise 对象实现异步操作。函数内部可包含零个或多个 await 关键字await 会暂停执行直到关联的 Promise 完成状态转换fulfilled 或 rejected。若函数执行过程中抛出异常该异常将直接触发返回的 Promise 进入 rejected 状态错误对象可通过 catch 方法或 then 的第二个回调参数捕获。下面是一个使用 async/await 的示例模拟同步方法执行异步操作的场景3 秒后返回一个字符串。async function myAsyncFunction(): Promisestring { const result: string await new Promise((resolve: Function) { setTimeout(() { resolve(Hello, world!); }, 3000); }); console.info(result); // 输出 Hello, world! return result; } Entry Component struct PromiseAsyncAwait { State message: string Hello World; build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(async () { let res await myAsyncFunction(); console.info(Result is: res); this.message success; }) } .width(100%) } .height(100%) } }
延伸阅读

更多相关文章

2026/11/1 14:04:19

大模型API稳定性与易用性评估及选型指南

1. 为什么需要关注大模型API的稳定性与易用性 在AI应用开发领域,大模型API的接入质量直接影响项目成败。最近半年处理过47个企业级AI项目,其中31个卡在API对接环节——要么响应不稳定导致用户体验断裂,要么文档晦涩难懂拖慢开发进度。OpenCla…

2026/11/1 14:23:19

柑橘病害YOLO检测数据集构建与模型优化实战

1. 项目背景与核心价值 柑橘病害检测数据集(YOLO格式)是农业AI领域的重要基础设施资源。作为国内首个公开可用的柑橘类作物病害标准化检测数据集,它解决了传统农业病害识别中样本不足、标注不规范两大痛点。我在参与某省智慧农业项目时&#…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&…

2026/11/5 13:50:18

基于Django的运维平台实战:资产、发布、巡检、告警一体化

简介:这份资源是一套基于Django框架开发的运维平台源码,面向具备Python基础、希望了解Web运维系统实现思路的开发者与运维人员,可用于学习主机管理、服务监控、日志查看、任务调度、权限控制、资源统计、脚本执行与故障告警等常见运维模块的落…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

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

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