
摘要
在鸿蒙(HarmonyOS ArkTS/JS)应用开发中,异步操作几乎无处不在。无论是网络请求、文件读写,还是数据库操作,开发者都需要和异步逻辑打交道。鸿蒙在这方面和 Web 前端保持了高度一致,基本依赖 Promise 和 async/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,更加稳定和原生。
总结
在鸿蒙应用开发中,异步处理是核心能力之一。无论是 网络请求 、文件操作 ,还是 数据库访问 ,几乎都要依赖 Promise 和 async/await。
- Promise 更适合链式调用;
- async/await 可读性更好,适合复杂场景;
- 鸿蒙系统 API 基本都提供了 Promise 支持,开发体验非常接近前端 Web 开发。
写鸿蒙应用的时候,不必害怕异步逻辑,只要熟练掌握 Promise 和 async/await,就能轻松应对大多数开发场景。