渐进式编程课
鸿蒙 目录
第 49 课2026.09.09

让并发关闭只复用进行中的任务,并在释放完成后清理临时状态。

第 49 课:释放完成后清理并发标记

  • 日期:2026-09-09
  • 课程序号:第 49 课
  • 知识点:Promise.finally 与生命周期状态

用途

让并发关闭只复用进行中的任务,并在释放完成后清理临时状态。

核心概念

finally 无论 Promise 成功或失败都会执行;清理进行中标记后,后续生命周期操作不会误拿已经结束的任务。

最小代码或操作示例

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

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

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

3~5 分钟练习

让 release() 第一次抛错,捕获后再次调用 close(),观察是否创建新的 Promise。

参考答案

第一次结束时 finally 已清空 closing,第二次调用会重新执行 release()。

与上一课的联系

上一课让并发调用共享同一次释放;本课补齐该共享状态在任务结束后的生命周期。