then方法返回的Promise与回调返回的Promise是否为同一实例?
Promise的then方法是否会直接返回回调函数返回的Promise实例?
答案很明确:不会。then方法永远会返回一个新的Promise实例,而不是直接返回回调函数里返回的那个Promise。你代码里pro === p2打印false,就是因为这是两个完全不同的Promise对象。
为什么看起来结果一致?
当你的then回调返回一个Promise(比如代码里的p2)时,then返回的新Promise(也就是pro)会进入"等待"状态,它会跟随回调返回的Promise的状态变化:
- 如果
p2最终fulfilled,pro也会fulfilled,并且把p2的resolve值作为自己的resolve结果; - 如果
p2最终rejected,pro也会rejected,把p2的reject原因作为自己的失败原因。
这就是为什么你看到pro和p2的执行结果完全同步,但它们本身并不是同一个实例。
then方法的核心逻辑简化版
可以把then的核心逻辑大致理解成这样(实际规范实现会更严谨):
Promise.prototype.then = function(onFulfilled) { // 新建一个Promise作为返回值 const newPromise = new Promise((resolve, reject) => { // 当原Promise fulfilled时执行回调 this.onFulfilled = () => { try { const result = onFulfilled(this.value); // 如果回调返回的是Promise,就"接管"它的状态 if (result instanceof Promise) { result.then(resolve, reject); } else { // 如果是普通值,直接resolve这个值 resolve(result); } } catch (e) { // 回调抛出异常的话,新Promise直接reject reject(e); } }; }); return newPromise; };
核心就是:新建Promise,根据回调的返回值决定这个新Promise的最终状态。
结合你的代码分析
- 调用
p.then(...)时,立刻创建了一个新Promise赋值给pro; - 10秒后第一个Promise fulfilled,执行回调函数,创建
p2并返回; then返回的pro会监听p2的状态:5秒后p2fulfilled,pro也跟着fulfilled,并且用p2的resolve值作为自己的结果;- 但
pro和p2是两个独立的Promise实例,所以pro === p2为false。
内容的提问来源于stack exchange,提问作者curiousmind
相关产品推荐
相关产品推荐

