渐进式编程课
鸿蒙 目录
第 50 课2026.09.10

避免成功释放后再次执行底层释放。

第 50 课:关闭成功后保持已释放状态

  • 日期:2026-09-10
  • 课程序号:第 50 课
  • 知识点:释放状态与并发任务分离

用途

避免成功释放后再次执行底层释放。

核心概念

进行中的 Promise 只负责并发复用;成功标记负责后续幂等返回,失败时不写成功标记。

最小代码或操作示例

ts
class Handle {
  private closing?: Promise<void>
  private closed: boolean = false
  private releaseFn: () => Promise<void>
  constructor(releaseFn: () => Promise<void>) { this.releaseFn = releaseFn }
  close(): Promise<void> {
    if (this.closed) return Promise.resolve()
    if (this.closing) return this.closing
    this.closing = this.releaseFn().then((): void => { this.closed = true })
      .finally((): void => { this.closing = undefined })
    return this.closing
  }
}

3~5 分钟练习

连续两次等待 close(),记录传入的 releaseFn 调用次数。

参考答案

成功后第二次直接返回,只调用一次 releaseFn。

与上一课的联系

沿用上一课的并发任务引用及完成后清理逻辑;本课只增加成功释放事实,并将已有释放操作作为构造参数传入,便于下一课计数验证。

时效校验

时效校验:2026-09-24(华为 Promise 异步操作官方资料;本机 HarmonyOS 26.0.0/API 26 SDK)。Promise、then、finally 为当前 ArkTS 标准用法;本课未调用废弃接口。

官方参考