渐进式编程课
鸿蒙 目录
第 48 课2026.09.08

两个调用者同时关闭资源时,只执行一次底层释放,并让双方等待同一个结果。

第 48 课:并发关闭共享同一次释放

  • 日期:2026-09-08
  • 课程序号:第 48 课
  • 知识点:生命周期并发与 Promise 复用

用途

两个调用者同时关闭资源时,只执行一次底层释放,并让双方等待同一个结果。

核心概念

用明确类型保存进行中的 Promise<void>;并发调用复用它,避免同一资源在释放完成前被重复处理。

最小代码或操作示例

ts
class Handle {
  private closing?: Promise<void>

  close(): Promise<void> {
    if (this.closing) {
      return this.closing
    }
    this.closing = this.release()
    return this.closing
  }

  private async release(): Promise<void> {
    await Promise.resolve()
  }
}

3~5 分钟练习

连续调用两次 close(),比较两个返回值是否引用同一个 Promise。

参考答案

handle.close() === handle.close() 为 true,两次调用共享同一次释放过程。

与上一课的联系

上一课处理首次失败后的顺序重试;本课进一步约束释放尚未完成时的并发调用。