Promise.withResolvers是专为跨函数、跨回调、跨生命周期场景设计的工具,用于解耦Promise创建与状态决议,支持安全传递resolve/reject,适用于一次性事件监听、回调API封装、可取消异步操作及测试状态模拟等典型场景。
Promise.withResolvers 不是用来让 Promise 更“酷”的语法糖,而是专为解决「控制权要跨多个函数、多次回调、甚至不同生命周期」这类真实难题设计的工具。它把 promise 创建和状态决议彻底分开,让 resolve/reject 可以安全传递、延迟调用、按需触发。
它不是 new Promise 的替代品,只在以下情况真正必要:
addEventListener(..., { once: true })),回调里才调用 resolveXMLHttpRequest、fs.readFile),又不想把 resolve/reject 挂到 this 或暴露成公共属性过去常用这种写法:
let _resolve, _reject;问题在于:变量易被覆盖、作用域污染、生命周期难追踪、静态分析困难。而 withResolvers 天然返回配对三元组:
它不自动帮你处理上下文或错误边界,几个关键细节必须留意:
const { promise } = Promise.withResolvers(); resolve('ok') 会报错,因为 resolve 未定义this 绑定,传给事件监听器时要用箭头函数或 .bind() 包裹,否则调用失败.catch(),会触发 unhandledRejection,Node.js 中可能 crash 进程截至 2026 年 5 月,Chrome 120+、Edge 120+、Node.js 21.7+ 已原生支持;Firefox 和 Safari 尚未实现。
if (typeof Promise.withResolvers === 'function')
@ungap/promise-with-resolvers)