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

React StrictMode下Promise构造执行一次但then回调触发两次的原因

为什么Promise成功回调会触发两次

这个现象本质是 React StrictMode 的开发检测逻辑、Promise 自身的执行机制,以及浏览器控制台的日志展示特性共同导致的,具体逻辑如下:

  • React StrictMode 的固有开发行为
    仅在开发环境下,React 18+ 会刻意对每个函数组件执行两次完整的函数体逻辑,用来检测代码中是否存在未做清理的副作用、不符合 React 规范的写法。这两次执行是同步完成的,目的是在开发阶段尽早暴露潜在问题,生产环境不会触发这套逻辑。
  • 两段打印的执行时机差异
    • ---> inside a Promise obj <-- 的打印逻辑写在 Promise 构造函数的执行器回调里。new Promise() 被调用时,传入的执行器函数会同步立刻执行,没有任何异步调度。你观察到它只打印1次,并非真的只执行了一次:两次同步组件执行产生的日志内容完全一致,被浏览器控制台默认开启的"相似日志聚合"功能合并展示了,只是视觉上看起来只有1次。
    • ---> Promise fulfilled <-- 的打印逻辑写在 Promise.then() 注册的成功回调里。这类回调属于微任务,不受组件卸载、清理逻辑的影响:只要对应 Promise 实例的状态被置为成功,回调就会被加入微任务队列,等所有当前同步代码全部执行完,被JS引擎依次执行。
  • 两次回调触发的完整流程
    两次同步执行 Home 组件函数体时,会创建两个独立的 Promise 实例:
    1. 第一次创建 Promise 时,执行器同步运行,立刻将 Promise 置为成功状态,对应的第一个 then 回调被加入微任务队列
    2. 第二次创建 Promise 时,执行器同步运行,同样立刻将 Promise 置为成功状态,对应的第二个 then 回调被加入微任务队列
      等所有同步代码(包括两次组件执行、React 的 DOM 提交挂载流程)跑完,微任务队列里的两个回调会按顺序依次执行,最终就输出了两次成功回调的日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 11:27:07