鸿蒙开发中 Promise 机制的解析

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

鸿蒙(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 线程池加速
调试支持基础堆栈增强错误追踪

建议

  1. 所有异步 API 封装为 Promise 形式
  2. 复杂流程使用 async/await 提升可读性
  3. 关键操作添加取消和超时控制
  4. 利用 Promise.allSettled 处理部分失败场景

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值