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

Promise的resolve和reject回调是否可能被同时调用?

Promise的resolve和reject回调是否有可能被同时调用?

答案是不会——Promise的设计本身就保证了它的状态是不可逆的,一旦调用resolve或者reject中的任意一个,Promise的状态就会固定下来,后续再调用另一个回调会被直接忽略,不会触发对应的then或catch逻辑。

具体解释:

Promise有三种状态:pending(等待中)、fulfilled(已完成,由resolve触发)、rejected(已失败,由reject触发)。当Promise处于pending状态时,调用resolve会把它转为fulfilled,调用reject会转为rejected;但状态一旦切换完成,不管再调用多少次resolve或reject,都不会改变这个状态了。

结合你的代码来看:

你的getAdminUgData返回一个Promise,假设它的内部逻辑是这样的:

export function getAdminUgData(){ 
  return new Promise((resolve, reject) => {
    // 模拟异步操作
    setTimeout(() => {
      resolve('获取到的管理员数据');
      reject('出错了'); // 这行代码完全无效,因为Promise已经进入fulfilled状态
    }, 1000);
  });
}

这种情况下,reject的调用不会有任何效果,getData().then(...)会正常触发,catch里的逻辑永远不会执行。反过来,如果先调用reject再调用resolve,resolve也会被忽略,只会触发catch。

哪怕是在异步场景下(比如两个并行的异步任务,一个成功一个失败,分别调用resolve和reject),也只会有第一个触发的回调生效,第二个会被Promise引擎忽略。

小建议:

虽然规范会帮你兜底,但写代码时还是要尽量避免出现同时调用resolve和reject的逻辑分支,保证代码的可读性和严谨性,比如用return来终止后续逻辑:

new Promise((resolve, reject) => {
  if (successCondition) {
    resolve(result);
    return; // 终止后续代码,避免误调用reject
  }
  reject(error);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:22:52