news 2026/7/24 9:13:39

ArkTS 异步并发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArkTS 异步并发

Promise 和 async/await 是标准的 JS 异步语法,提供异步并发能力。异步代码执行时会被挂起,在异步操作完成后恢复执行,确保同一时间只有一段代码在运行。以下是典型的异步并发使用场景:

  • I/O 非阻塞操作:网络请求、文件读写、定时器等。
  • 任务轻量且无 CPU 阻塞:单次任务执行时间短。
  • 逻辑依赖清晰:任务有明确的顺序或并行关系。

异步并发是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,可以继续执行其他异步代码。

Promise

Promise 是一种用于处理异步操作的对象,可将异步操作转换为类似同步操作的风格,便于代码编写和维护。Promise 通过状态机制管理异步操作的不同阶段,有三种状态:pending(进行中)、fulfilled(已完成,也叫 resolved)和rejected(已拒绝)。创建后处于 pending 状态,异步操作完成后转换为 fulfilled 或 rejected 状态。

Promise 提供了 then、catch、finally 方法来注册回调函数,以处理异步操作的成功或失败结果。当 Promise 状态改变时,回调函数会被加入微任务队列等待执行,依赖事件循环机制在宏任务执行完成后优先执行微任务,从而保证回调函数的异步调度。

最基本的用法是通过构造函数实例化一个 Promise 对象,传入一个带有两个参数的函数,称为 executor 函数。executor 函数接收两个参数:resolve 和 reject,分别表示异步操作成功和失败时的回调函数。

例如,以下代码创建了一个 Promise 对象并模拟了一个异步操作:

const promise: Promise<number> = 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/await

async/await 是用于处理异步操作的 Promise 语法糖,使编写异步代码更加简单和易读。使用 async 关键字声明异步函数,并使用 await 关键字等待 Promise 的解析(fulfilled 或 rejected),以同步方式编写异步操作的代码。

async 函数返回 Promise 对象,实现异步操作。函数内部可包含零个或多个 await 关键字,await 会暂停执行,直到关联的 Promise 完成状态转换(fulfilled 或 rejected)。若函数执行过程中抛出异常,该异常将直接触发返回的 Promise 进入 rejected 状态,错误对象可通过 catch 方法或 then 的第二个回调参数捕获。

下面是一个使用 async/await 的示例,模拟同步方法执行异步操作的场景,3 秒后返回一个字符串。

async function myAsyncFunction(): Promise<string> { 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%') } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 9:10:44

AI绘画:免费与付费AI绘画工具的优劣分析

AI绘画&#xff1a;免费与付费AI绘画工具的优劣分析你好&#xff01;很多刚接触AI绘画的朋友都会问一个问题&#xff1a;“免费的AI绘画工具够用吗&#xff1f;我到底要不要花钱&#xff1f;” 这是一个非常实际的问题。毕竟谁都不想花冤枉钱&#xff0c;但同时又怕免费的限制太…

作者头像 李华
网站建设 2026/7/24 9:07:00

AI Agent社区架构设计与开发实战指南

1. AI Agent社区的底层逻辑与核心价值AI Agent社区本质上是一个由智能体程序构成的虚拟社会系统。这里的"Agent"不是简单的聊天机器人&#xff0c;而是具备环境感知、自主决策和持续学习能力的数字实体。这类社区通常运行在分布式计算环境中&#xff0c;每个Agent都拥…

作者头像 李华
网站建设 2026/7/24 9:05:16

MSP430 ADC10_B模块实战:从低功耗配置到温度传感器校准

1. MSP430 ADC10_B模块&#xff1a;从入门到精通的实战指南 在嵌入式开发&#xff0c;尤其是电池供电的低功耗应用里&#xff0c;模数转换器&#xff08;ADC&#xff09;的性能和功耗往往是决定系统成败的关键。我接触过不少MCU的ADC模块&#xff0c;但MSP430的ADC10_B模块以其…

作者头像 李华
网站建设 2026/7/24 9:02:39

Prompt Engineering技巧:如何优化AI提示词获得精准输出

1. 什么是Prompt Engineering&#xff1f;Prompt Engineering&#xff08;提示工程&#xff09;是近年来随着大语言模型&#xff08;LLM&#xff09;兴起而出现的一门新兴技术。简单来说&#xff0c;就是通过精心设计和优化输入给AI模型的提示词&#xff08;prompt&#xff09;…

作者头像 李华
网站建设 2026/7/24 9:00:49

HarmonyOS 6.1 AI深度融合:从“功能”到“智能”的大模型落地

系列智能化篇第47篇。全场景篇后&#xff0c;有产品经理问&#xff1a;“现在的电商Demo功能齐全了&#xff0c;但感觉还是‘死’的。能不能接入AI&#xff0c;让它像真人客服一样聊天&#xff0c;或者自动生成商品文案&#xff1f;” 这正是生成式AI&#xff08;GenAI&#xf…

作者头像 李华
网站建设 2026/7/24 9:00:25

拒绝倍速刷视频!4款AI神器一键把视频变干货笔记,省时10倍

有没有人和我一样&#xff1f; 刷网课、干货视频、行业教程的时候&#xff0c;最怕一件事&#xff1a;花1小时看完&#xff0c;转头啥也记不住&#xff0c;想复盘又要从头拖拽进度条&#xff0c;太浪费时间&#xff01; 尤其是长视频、直播回放、系列教程&#xff0c;全程手动记…

作者头像 李华