Promise天然适合表达一次性、不可逆的状态变化,其pending/fulfilled/rejected三种状态和链式特性可清晰组织异步流程;通过Promise.withResolvers解耦决议责任,结合UI框架实现声明式状态渲染。
Promise 本身不是状态管理库,但它天然适合表达和流转“一次性、不可逆”的状态变化——比如“请求中→成功”或“请求中→失败”。利用好它的三种状态(pending/fulfilled/rejected)和链式特性,就能在不引入额外框架的前提下,清晰组织异步流程的状态逻辑。
很多场景本质是“等一个结果”,比如点击一次按钮后等待响应、监听一次事件、获取一次配置。这类操作只需决议一次,正好匹配 Promise 的语义:
例如封装 DOM 元素首次点击:
function waitForFirstClick(el) { const { promise, resolve } = Promise.withResolvers(); const handler = () => { el.removeEventListener('click', handler); resolve('clicked'); }; el.addEventListener('click', handler); return promise;}
调用方只关心 promise,无需手动维护 flag 或回调队列。
当多个异步操作必须按序执行(如:先登录 → 再拉取用户信息 → 最后加载偏好设置),Promise 链天然提供线性状态流:
避免手写状态机或全局变量标记“当前走到哪一步”,状态推进由执行时机自动保证。
传统 new Promise 需在构造时传入 executor,把 resolve/reject 锁死在内部作用域。而 Promise.withResolvers 返回 { promise, resolve, reject } 三元组,让“谁创建”和“谁决议”可以分离:
特别适合插件系统、跨模块通信、测试模拟等需要延迟决议的场景。
在 Vue、React 等框架中,Promise 实例可直接作为响应式数据源:
把“加载中”“成功展示”“报错提示”这些 UI 状态,直接映射到 Promise 的内在状态,减少手动维护 loading/error/data 三个变量的样板代码。