我是兰瓶Coding,一枚刚踏入鸿蒙领域的转型小白,原是移动开发中级,如下是我学习笔记《零基础学鸿蒙》,若对你所有帮助,还请不吝啬的给个大大的赞~

前言

你有没有在写鸿蒙应用时,突然被一串“异步回调地狱”搞到怀疑人生?😵‍💫
本来想着只是请求个数据,结果一层回调套一层Promise,最后async/await都快变成哲学问题了……

别慌,今天咱们就来聊聊鸿蒙ArkTS(TypeScript + Ark引擎增强版)中的异步与并发编程
这一块要玩明白,才能真正写出又快又稳、不掉帧的HarmonyOS应用。

🧩 一、异步API的底层逻辑:鸿蒙的“非阻塞世界”

在ArkTS里,几乎所有I/O相关的操作(网络请求、文件读写、定时任务)都是异步API
这意味着——你发出一个任务,不等它干完,程序就继续往下跑了。

来个小例子,看似简单,但暗藏玄机:

import fs from '@ohos.file.fs';

console.info("准备读取文件啦~");

fs.open('/data/test.txt', (err, file) => {
  if (err) {
    console.error("文件读取失败:" + err.message);
    return;
  }
  console.info("文件打开成功,准备读取内容!");
});
console.info("文件操作指令已发出!");

运行结果:

准备读取文件啦~
文件操作指令已发出!
文件打开成功,准备读取内容!

是不是懵了?😅
没错——最后那句“文件打开成功”居然最后才打印!
这就是异步API的本质:它不会“等”你,而是让出线程,让事件循环(Event Loop)去调度。

🧠 二、Promise与async/await:异步编程的“糖衣炮弹”

老派的回调写多了容易“嵌套地狱”,于是ArkTS也继承了现代JS那套Promise机制,让异步逻辑更可读。

function fetchData(): Promise<string> {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("数据请求成功 ✅");
    }, 1000);
  });
}

fetchData().then(result => {
  console.info(result);
}).catch(err => {
  console.error("请求失败:" + err);
});

👀看起来清爽多了吧?
不过更进一步的神器,就是async/await
它让异步写起来像同步一样自然,尤其是在鸿蒙中要同时操作UI和数据逻辑时特别舒服。

async function showData() {
  console.info("开始拉取数据...");
  let result = await fetchData();
  console.info("结果出来啦:" + result);
}

showData();

控制台输出顺序:

开始拉取数据...
(1秒后)
结果出来啦:数据请求成功 ✅

是不是一口气顺下来就明白了?
这就是ArkTS的魅力——兼具TS语法的优雅,又能与鸿蒙运行时的异步机制无缝融合。

⚙️ 三、并发任务调度:TaskPool登场!

好,前面我们讲的都是异步执行,但在鸿蒙中,还存在更高阶的场景——并发任务
比如你想同时:

  • 下载三张图片
  • 解析两份JSON
  • 同时更新UI状态

要是都一个一个await,那多慢啊!这时候就得请出鸿蒙的神器:TaskPool

🎯 TaskPool是啥?

简单来说,它是ArkTS提供的线程池,能让你把计算密集型任务扔进去“异步并行”地跑,不阻塞主线程。

import taskpool from '@ohos.taskpool';

@Concurrent
function heavyCalc(num: number): number {
  let result = 0;
  for (let i = 0; i < num; i++) {
    result += Math.sqrt(i);
  }
  return result;
}

async function main() {
  console.info("开始执行多个计算任务...");
  let task1 = taskpool.execute(heavyCalc, 1000000);
  let task2 = taskpool.execute(heavyCalc, 2000000);
  let task3 = taskpool.execute(heavyCalc, 3000000);

  let [r1, r2, r3] = await Promise.all([task1, task2, task3]);
  console.info("任务结果:", r1, r2, r3);
}

main();

💡@Concurrent装饰器告诉Ark引擎——这个函数是可以被并发执行的!
TaskPool.execute() 则自动分配线程执行,让你CPU的每个核都热起来🔥

结果?速度飞起,还不卡UI。
这才是真正的“异步 + 并发”双重奏!

🔔 四、EventHandler:事件驱动的节奏大师

有时候你并不想单纯等一个异步任务完成,而是想在不同事件阶段做不同事,这时就得靠 EventHandler 出场。

它相当于鸿蒙的“事件总线”,可以监听、派发和定时触发任务。

import eventHandler from '@ohos.eventHandler';

let handler = new eventHandler.EventHandler("MyHandler");

handler.postTask(() => {
  console.info("延迟任务:Hello Harmony!");
}, 1000);

handler.sendEvent({ eventId: 101, eventData: "自定义事件" });
handler.on("event_101", (data) => {
  console.info("接收到事件数据:" + JSON.stringify(data));
});

你可以把它理解为一个轻量级调度器:

  • postTask() 处理定时异步任务
  • sendEvent() & on() 实现事件通信

在鸿蒙多线程和跨组件场景下,EventHandler简直是异步通信的灵魂角色

🧭 五、实战思路:异步 ≠ 并发,但要善用两者!

场景 推荐方案
等待单个异步任务 async/await
同时执行多个独立任务 Promise.all
高并发计算任务 TaskPool + @Concurrent
事件驱动或延迟执行 EventHandler

组合拳示例👇

async function appStart() {
  console.info("应用启动 🚀");
  await showData();

  // 并发执行后台任务
  let tasks = [
    taskpool.execute(heavyCalc, 1000000),
    taskpool.execute(heavyCalc, 2000000)
  ];
  await Promise.all(tasks);

  // 通知事件中心
  handler.sendEvent({ eventId: 200, eventData: "启动完毕" });
}

这就是一个真正的鸿蒙异步全景式应用启动逻辑——优雅、稳健、丝滑。✨

🏁 结语:异步不只是技巧,更是“节奏感”

异步编程从来不只是语法问题,而是一种程序思维方式
你要懂得何时等待、何时放手、何时并发、何时调度。

在ArkTS的世界里,Promise 是旋律,TaskPool 是和声,EventHandler 是节拍器。
三者合奏,就是一曲高效又优雅的鸿蒙交响曲。🎶

写在最后
  下次当你再看到一堆回调或者await时,不妨问问自己一句:

“我现在是在异步,还是在并发?”
懂了这句,恭喜你——你已经从写代码的工匠,变成了驾驭异步节奏的音乐家。🎧

(未完待续)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐