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
相关产品推荐
相关产品推荐

