鸿蒙开发实战:掌握 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,就能轻松应对大多数开发场景。

相关推荐
前端不太难2 小时前
从单页面到系统化:鸿蒙 App 演进路径
华为·状态模式·harmonyos
想你依然心痛4 小时前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“文思智脑“——PC端AI智能体沉浸式智能写作工作台
人工智能·ar·harmonyos·ai写作
小雨青年4 小时前
鸿蒙 HarmonyOS 6 | Pura X Max 鸿蒙原生适配 09:展开态列表增加字段但不变复杂
华为·harmonyos
richard_yuu4 小时前
鸿蒙治愈游戏模块实战|四大轻量解压游戏、ArkTS动画交互与低功耗落地
游戏·交互·harmonyos
阿钱真强道8 小时前
24 鸿蒙LiteOS GPIO中断实战:从原理到上升沿/下降沿详解
harmonyos·中断·rk·liteos·开源鸿蒙·瑞芯微·rk2206
cd_9492172110 小时前
鸿蒙系统下抖音存储空间不足怎么办?缓存清理教程
缓存·华为·harmonyos
轻口味13 小时前
HarmonyOS 6.1 全栈实战录 - 14 渲染树透镜:FrameNode 渲染状态感知与高性能 UI 调优实战
ui·华为·harmonyos
HwJack2013 小时前
HarmonyOS NEXT 游戏APP开发中如何正确拦截退出手势
游戏·华为·harmonyos
HwJack2013 小时前
HarmonyOS APP开发中ArkTS/JS 类型错误全景拆解
javascript·华为·harmonyos
lqj_本人14 小时前
鸿蒙PC:鸿蒙版本 Electron 框架环境搭建并且实现 XH 笔记应用
笔记·electron·harmonyos