JavaScript中Promise的resolve传入另一个Promise的行为疑问
问题结论
你的认知完全符合Promise的标准行为,不存在基础理解错误。Promise构造函数中传入的resolve方法接收Promise作为参数时,不会将该Promise作为普通值传递给后续then回调,而是会等待传入的Promise状态敲定,直接复用它的最终结果。
行为逻辑说明
ECMAScript标准明确规定了resolve方法的处理规则:
- 如果传入的参数是当前Promise本身,直接抛出
TypeError - 如果传入的参数是带有
then方法的对象/函数(也叫thenable,原生Promise属于标准thenable),会将当前Promise的状态与该thenable绑定:- 当thenable兑现时,当前Promise以相同的兑现值完成
- 当thenable拒绝时,当前Promise以相同的拒因失败
- 其他非thenable类型的参数,会直接作为当前Promise的兑现值返回
你的测试代码中exp1的外层resolve接收了内部的延时Promise,因此外层Promise会等待2秒直到内部Promise兑现为foo,最终exp1().then拿到的结果就是foo,和exp2中先await再resolve的逻辑完全等价。
补充注意点
- 上述拆箱逻辑仅适用于
resolve方法,如果调用reject时传入Promise,会直接将该Promise对象作为拒因返回,不会等待它的状态变更 - 即使是非原生的自定义thenable,只要符合调用规范,同样会触发该拆箱逻辑,示例如下:
new Promise(resolve => { // 自定义thenable resolve({ then: (onFulfilled) => setTimeout(() => onFulfilled('custom value'), 1000) }) }).then(console.log) // 1秒后输出 custom value
内容的提问来源于stack exchange,提问作者Joji
相关产品推荐
相关产品推荐

