You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的最终状态。

结合你的代码分析

  1. 调用p.then(...)时,立刻创建了一个新Promise赋值给pro;
  2. 10秒后第一个Promise fulfilled,执行回调函数,创建p2并返回;
  3. then返回的pro会监听p2的状态:5秒后p2fulfilled,pro也跟着fulfilled,并且用p2的resolve值作为自己的结果;
  4. 但pro和p2是两个独立的Promise实例,所以pro === p2为false。

内容的提问来源于stack exchange,提问作者curiousmind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 08:17:09