当resolve传入promise时,新promise会自动展开并跟随其终态和终值;若传入pending promise则保持pending,fulfilled时取其值,rejected时取其reason。

当 resolve 传入一个 Promise 时,JavaScript 会自动“展开”(unwrap)它:新 Promise 的状态和值将由传入的 Promise 决定,而不是直接把那个 Promise 当作普通值。
resolve 传入 Promise 的行为本质
这是 Promise/A+ 规范定义的“thenable 检测”逻辑的一部分。只要传给 resolve 的是一个带有 then 方法的对象(包括原生 Promise),Promise 构造函数就会等待它完成,并以它的终态(fulfilled 或 rejected)和终值来决定当前 Promise 的终态。
- 如果传入的是一个 pending 状态的 Promise,当前 Promise 也会保持 pending,直到它 settle
- 如果传入的 Promise 最终 fulfilled,当前 Promise 就 fulfilled,值为它的终值
- 如果传入的 Promise 最终 rejected,当前 Promise 就 rejected,理由为它的 rejection reason
实际写法示例
以下代码中,p2 不会以 p1 这个 Promise 对象为值,而是“跟随”它的结果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const p1 = new Promise(resolve => setTimeout(() => resolve('done'), 100));
const p2 = new Promise(resolve => {
resolve(p1); // ← 关键:传入另一个 Promise
});
p2.then(console.log); // 100ms 后输出 'done'
等价于直接写:const p2 = p1; —— 它们行为一致(但内部 Promise 实例不同)。
和 resolve 普通值的区别
对比一下传原始值的情况:
const p3 = new Promise(resolve => resolve('hello'));
// p3.fulfilled → 值是字符串 'hello'
const p4 = new Promise(resolve => resolve(Promise.resolve('hello')));
// p4.fulfilled → 值是字符串 'hello'(不是 Promise 对象)
// 因为 Promise.resolve('hello') 被展开,最终取其值
也就是说,resolve(p) ≠ resolve(() => p),也不等于 { value: p };它触发的是 promise 解析过程(promise resolution procedure)。
常见误区提醒
-
不要误以为
resolve(p)是“把 p 包进新 Promise” —— 它是“链式委托”,结果由 p 决定 - 如果想让新 Promise 的值就是那个 Promise 对象本身(不展开),得包装一层,比如:
resolve({ p })或resolve(Promise.resolve(p))(后者仍会展开,所以不行),正确做法是:resolve(Object.freeze(p))或更稳妥地用非 thenable 包装:resolve({ promise: p }) - 嵌套过深时(如
resolve(Promise.resolve(Promise.resolve(...)))),引擎仍会递归展开到最内层终值,不会卡住
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










