Promise锁机制是开发者通过状态标记与Promise缓存实现的防重复提交策略:异步开始时锁定,后续调用复用同一Promise;推荐用pendingRequest缓存Promise实例并确保终态重置,支持参数化key、错误后重置及bypassLock等边界处理。

Promise 锁机制本质上不是 JavaScript 原生提供的功能,而是开发者通过状态标记 + Promise 缓存实现的防重复提交策略。核心思路是:在异步操作开始时锁定,期间后续调用直接返回同一个 Promise 实例,避免发起多次请求。
用一个变量标记“是否正在执行”
最简单直接的方式是用布尔变量记录状态:
- 发起请求前检查是否 pending === true,若是则直接返回已存在的 Promise 或拒绝新调用
- 设置 pending = true 后立即发起请求,完成后重置 pending = false
- 注意:需确保无论成功或失败都重置状态,否则锁会永久卡住
缓存并复用同一个 Promise 实例(推荐)
比单纯用布尔值更健壮——后续调用直接返回首次创建的 Promise,天然共享结果,无需重复处理逻辑:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 声明一个变量(如 pendingRequest)初始为 null
- 每次调用时:若 pendingRequest 存在,直接 return 它;否则新建 Promise 并赋值给 pendingRequest
- Promise 的 resolve/reject 后,将 pendingRequest 置为 null,允许下次触发
- 示例场景:表单提交、搜索建议、按钮点击等用户可能快速多次触发的操作
封装成可复用的高阶函数
把锁逻辑抽离,便于在多个地方统一使用:
立即学习“Java免费学习笔记(深入)”;
- 接收一个异步函数(如 api.submit()),返回带锁的新函数
- 内部维护 currentPromise 和状态控制
- 支持手动取消(可选):通过 AbortController 或清空 currentPromise 实现
- 避免和业务逻辑耦合,提升可测试性和可维护性
注意边界情况
实际使用中容易忽略的关键点:
- 不同参数应视为不同请求:若函数接受参数(如 id),不能全局共用一个锁,需按参数做 key 缓存(类似记忆化)
- 错误不自动释放锁:Promise reject 后必须重置状态,否则后续调用会被永远阻塞
- 不适用于需强制刷新的场景:比如“重新加载数据”,此时应提供 bypassLock 参数主动跳过锁
- UI 层仍需配合禁用按钮或 loading 状态,避免用户误以为没响应

















