鸿蒙开发实战:掌握 Promise 和 async/await,轻松搞定异步请求

摘要

在鸿蒙(HarmonyOS ArkTS/JS)应用开发中,异步操作几乎无处不在。无论是网络请求、文件读写,还是数据库操作,开发者都需要和异步逻辑打交道。鸿蒙在这方面和 Web 前端保持了高度一致,基本依赖 Promiseasync/await 来管理异步任务。本文会结合实际开发场景,通过示例代码展示如何在鸿蒙中优雅地处理异步逻辑。

引言

在早期的 JavaScript 开发里,异步处理主要依赖 回调函数(callback) ,一旦逻辑复杂就容易出现 "回调地狱"。随着 ES6 引入 Promise ,再加上 async/await 的普及,异步代码的可读性和可维护性得到了极大提升。

鸿蒙的 ArkTS/JS 开发环境延续了这一模式。无论是官方提供的系统 API(比如 http、fileio、rdb),还是第三方库(比如 axios),都支持 Promise 风格的调用方式。这让前端开发者几乎不用学习额外的语法,就能顺畅地写出可维护的鸿蒙应用。

异步处理的两种方式

使用 Promise

Promise 是最基础的写法,适合链式调用的场景。

ts 复制代码
import http from '@ohos.net.http';

let httpRequest = http.createHttp();

// 发起 GET 请求
httpRequest.request(
  "https://jsonplaceholder.typicode.com/todos/1",
  { method: http.RequestMethod.GET }
).then((result) => {
  console.log("请求成功:", result.result);
}).catch((err) => {
  console.error("请求失败:", err);
});

在这里,.then() 负责处理成功逻辑,.catch() 捕获异常。适合那种需要多层数据处理的链式写法。

使用 async/await

在业务逻辑复杂时,更推荐用 async/await。可读性更好,结构清晰。

ts 复制代码
import http from '@ohos.net.http';

async function fetchData() {
  try {
    let httpRequest = http.createHttp();
    const response = await httpRequest.request(
      "https://jsonplaceholder.typicode.com/todos/1",
      { method: http.RequestMethod.GET }
    );
    console.log("请求结果:", response.result);
  } catch (err) {
    console.error("出错了:", err);
  }
}

fetchData();

这里的写法就像同步代码一样直观,非常适合需要多次请求和复杂逻辑处理的场景。

系统 API 的异步支持

鸿蒙的很多系统 API 都支持 Promise,比如文件读写。

ts 复制代码
import fileio from '@ohos.fileio';

fileio.open("/data/storage/el2/base/test.txt", 0o2) // O_RDWR
  .then((fd) => {
    console.log("文件打开成功, fd:", fd);
  })
  .catch((err) => {
    console.error("文件打开失败:", err);
  });

通过这种方式,开发者可以直接用 Promise/await 来操作文件,而不用陷入繁琐的回调。

常见应用场景

网络请求获取数据

在实际项目中,调用后端接口获取数据是最常见的异步任务。

ts 复制代码
import http from '@ohos.net.http';

async function getUserData() {
  try {
    let httpRequest = http.createHttp();
    const res = await httpRequest.request(
      "https://jsonplaceholder.typicode.com/users/1",
      { method: http.RequestMethod.GET }
    );
    console.log("用户信息:", JSON.parse(res.result));
  } catch (err) {
    console.error("网络请求失败:", err);
  }
}

这里可以把数据直接解析成 JSON 并渲染到 UI 上,流程非常自然。

文件上传与下载

文件相关操作同样需要异步处理。比如下载文件:

ts 复制代码
import http from '@ohos.net.http';
import fileio from '@ohos.fileio';

async function downloadFile() {
  try {
    let httpRequest = http.createHttp();
    const response = await httpRequest.request(
      "https://jsonplaceholder.typicode.com/todos/1",
      { method: http.RequestMethod.GET }
    );
    let fd = await fileio.open("/data/storage/el2/base/download.json", 0o2 | 0o100); // O_RDWR | O_CREAT
    await fileio.write(fd, response.result);
    console.log("文件下载并保存成功");
  } catch (err) {
    console.error("下载失败:", err);
  }
}

这个例子模拟了从网络下载一段 JSON 并写入本地文件的过程。

数据库操作

比如在鸿蒙里用 RDB(关系型数据库) 进行读写时,也需要 Promise:

ts 复制代码
import dataRdb from '@ohos.data.rdb';

async function dbExample() {
  const storeConfig = { name: "User.db" };
  let rdbStore = await dataRdb.getRdbStore(storeConfig, 1);

  await rdbStore.insert("user", { "name": "Alice", "age": 22 });
  console.log("插入数据成功");

  let resultSet = await rdbStore.querySql("SELECT * FROM user");
  while (resultSet.goToNextRow()) {
    console.log("用户:", resultSet.getString(resultSet.getColumnIndex("name")));
  }
}

这种操作就特别适合用 async/await 来保持代码整洁。

QA 环节

Q1: 鸿蒙里所有异步 API 都支持 Promise 吗? 不完全是。部分老的 API 还可能保留 callback 风格,但大多数新版 API 都支持 Promise,建议优先使用 Promise/await。

Q2: async/await 和 Promise 有什么区别? 其实 async/await 只是 Promise 的语法糖,本质一样。区别在于 async/await 更像同步代码,适合复杂逻辑,而 Promise 更适合链式调用。

Q3: 我能在鸿蒙里直接用 axios 吗? 可以的,鸿蒙的 JS/TS 环境和 Web 类似,axios 完全可以跑。但在系统级别调用时,还是推荐用 @ohos.net.http 提供的 API,更加稳定和原生。

总结

在鸿蒙应用开发中,异步处理是核心能力之一。无论是 网络请求文件操作 ,还是 数据库访问 ,几乎都要依赖 Promiseasync/await

  • Promise 更适合链式调用;
  • async/await 可读性更好,适合复杂场景;
  • 鸿蒙系统 API 基本都提供了 Promise 支持,开发体验非常接近前端 Web 开发。

写鸿蒙应用的时候,不必害怕异步逻辑,只要熟练掌握 Promise 和 async/await,就能轻松应对大多数开发场景。

相关推荐
王嘉俊92511 分钟前
HarmonyOS 超级终端与服务卡片开发:打造无缝多设备交互体验
华为·架构·harmonyos·arkts·1024程序员节
俩毛豆1 小时前
【图片】【编缉】图片增加水印(通过组件的Overlay方法增加水印)
前端·harmonyos
逻极4 小时前
HarmonyOS 5 鸿蒙多设备适配与分布式开发指南
分布式·华为·harmonyos·鸿蒙
爱笑的眼睛1115 小时前
HarmonyOS Want意图传递机制深度解析
华为·harmonyos
爱笑的眼睛1118 小时前
HarmonyOS语音识别与合成:构建智能语音应用的深度指南
华为·harmonyos
阿里云云原生18 小时前
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
harmonyos
安卓开发者20 小时前
鸿蒙Next的AVSession Kit:重塑音视频播控的开发体验
华为·音视频·harmonyos
鸿蒙小白龙21 小时前
鸿蒙openharmony操作系统LiteOS-A内核技术全解析:架构、性能与开发实践
华为·架构·harmonyos·鸿蒙·鸿蒙系统·open harmony
2503_928411561 天前
10.23 @Observed深层监听
华为·harmonyos·鸿蒙
KongHen1 天前
UTS编写字符串编解码/加密插件(安卓及鸿蒙端)
前端·harmonyos