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

相关推荐
万少3 小时前
可可图片编辑 HarmonyOS 上架应用分享
前端·harmonyos
simple_lau8 小时前
H5资源包热更新:从下载、解压到渲染的实现方案
typescript·harmonyos·arkts
程序员二师兄9 小时前
记一次鸿蒙webview图片渲染失败的问题
前端·javascript·harmonyos
缘澄9 小时前
ArkTs声明式UI开发
harmonyos
大雷神14 小时前
鸿蒙中应用框架和应用模型
华为·harmonyos
马剑威(威哥爱编程)14 小时前
鸿蒙 NEXT开发中轻松实现人脸识别功能
华为·harmonyos·arkts·鸿蒙
张风捷特烈19 小时前
鸿蒙纪·Flutter卷#03 | 从配置证书到打包发布
android·flutter·harmonyos
大雷神1 天前
鸿蒙安卓前端中加载丢帧:ArkWeb分析
harmonyos