本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
鸿蒙(HarmonyOS)应用开发中,Promise 是处理异步操作的核心机制,其实现遵循 ECMAScript 标准,但结合鸿蒙的运行时环境有特定的优化和扩展。
一、Promise 的核心理解
1. 本质特性
- 异步容器:表示一个未来完成的操作(如网络请求、文件读写)
- 状态机:三种不可逆状态:
- 链式调用:通过
.then()
/.catch()
实现操作串联
2. 鸿蒙中的增强
- 与 Ability 生命周期绑定:当 Ability 销毁时,未完成的 Promise 会被自动取消(避免内存泄漏)
- 性能优化:底层使用 Native 线程池 执行异步任务,比纯 JS 实现效率更高
二、基础用法
1. 创建 Promise
function readFile(filePath: string): Promise<string> {
return new Promise((resolve, reject) => {
fs.readText(filePath, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
2. 链式调用
readFile("data.json")
.then(json => JSON.parse(json))
.then(data => processData(data))
.catch(err => console.error("失败:", err));
3. 并行处理
Promise.all([
fetchUserInfo(),
fetchProductList()
]).then(([user, products]) => {
updateUI(user, products);
});
三、鸿蒙特定场景
1. 与 UIAbility 生命周期联动
// 在 Ability 中管理异步任务
export default class MainAbility extends Ability {
private taskQueue: Promise<any>[] = [];
onDestroy() {
// Ability 销毁时取消所有任务
this.taskQueue.forEach(p => p.cancel());
}
async safeFetch(url: string) {
const task = new Promise((resolve, reject) => {
// ...网络请求逻辑
});
this.taskQueue.push(task);
return task.finally(() => {
this.taskQueue = this.taskQueue.filter(t => t !== task);
});
}
}
2. 与鸿蒙 API 结合
// 使用 Promise 封装系统 API
function takePicture(): Promise<image.PixelMap> {
return new Promise((resolve, reject) => {
const camera = await camera.getCameraManager();
camera.takePhoto({
onSuccess: (pixelMap) => resolve(pixelMap),
onFail: (err) => reject(err)
});
});
}
四、高级技巧
1. 取消机制扩展
class CancelablePromise<T> {
private isCanceled = false;
constructor(executor: (
resolve: (value: T) => void,
reject: (reason?: any) => void,
onCancel: (cb: () => void) => void
)) {
new Promise<T>((resolve, reject) => {
executor(resolve, reject, (cb) => {
if (this.isCanceled) cb();
});
});
}
cancel() {
this.isCanceled = true;
}
}
// 使用示例
const task = new CancelablePromise((resolve, reject, onCancel) => {
onCancel(() => cleanup());
// ...异步逻辑
});
2. 性能监控
Promise.prototype.then = (function(originalThen) {
return function(this: Promise<any>, ...args: any[]) {
const start = Date.now();
return originalThen.apply(this, args).finally(() => {
console.log(`耗时: ${Date.now() - start}ms`);
});
};
})(Promise.prototype.then);
五、与异步函数(async/await)结合
async function loadData() {
try {
const [user, products] = await Promise.all([
fetchUser(),
fetchProducts()
]);
await saveToLocal(user);
return products;
} catch (err) {
showErrorToast(err.message);
}
}
2. 注意事项
- 避免嵌套陷阱:多层 async 函数中需正确处理错误边界
- 并行优化:独立操作应使用
Promise.all
而非顺序 await
六、总结
特性 | 标准 Promise | 鸿蒙增强 |
---|---|---|
生命周期管理 | ❌ | ✅ 与 Ability 绑定 |
取消机制 | 手动实现 | 内置支持(部分API) |
执行效率 | 纯 JS 实现 | Native 线程池加速 |
调试支持 | 基础堆栈 | 增强错误追踪 |
建议:
- 所有异步 API 封装为 Promise 形式
- 复杂流程使用 async/await 提升可读性
- 关键操作添加取消和超时控制
- 利用
Promise.allSettled
处理部分失败场景