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

Promise创建时执行器接收的resolve和reject函数是什么?

关于Promise执行器中resolve/reject函数的本质

这是个非常好的问题——很多开发者刚开始深入Promise机制时都会有这个疑惑!咱们一步步拆解清楚:

核心结论

执行器函数被调用时传入的resolve和reject,是Promise规范/引擎内部实现的内置函数,它们的唯一职责就是修改当前Promise对象的状态,和你后续通过.then/.catch绑定的处理程序没有直接的预绑定关系。

详细解释

  1. 状态修改的核心作用
    这两个函数的本质是用来改变Promise的内部状态:

    • 调用resolve(值):会把Promise从pending(待定)状态切换为fulfilled(已兑现),同时把你传入的值保存为Promise的"终值"(eventual value)。
    • 调用reject(原因):会把Promise从pending状态切换为rejected(已拒绝),同时把你传入的错误/原因保存为Promise的"拒因"(reason)。
  2. 状态与处理程序的解耦
    即使你还没有通过.then/.catch绑定任何处理程序,调用resolve或reject依然会正常修改Promise的状态——因为Promise的状态是自身内部维护的,和是否有监听它的处理程序无关。
    当后续你绑定处理程序时:

    • 如果Promise已经是fulfilled状态,.then的成功回调会立即执行,用上之前保存的终值。
    • 如果Promise已经是rejected状态,.catch的失败回调会立即执行,用上之前保存的拒因。
  3. 内部逻辑的简化理解
    你可以把这两个函数的内部逻辑想象成(简化版):

    • 首先检查当前Promise的状态,如果已经不是pending(状态不可逆),直接忽略调用。
    • 如果是pending,就更新状态并保存终值/拒因。
    • 此时如果已经有通过.then/.catch注册的处理程序,就把这些处理程序放到微任务队列等待执行;如果还没有注册处理程序,就把状态和值暂存起来,等后续注册时再触发对应的回调。

示例代码验证

// 创建Promise时,执行器立即执行
const myPromise = new Promise((resolve, reject) => {
  console.log("执行器已调用");
  // 调用内置的resolve,修改状态为fulfilled,保存终值"Done"
  resolve("Done");
});

// 此时还没有绑定任何.then处理程序,但myPromise已经是fulfilled状态了
console.log(myPromise); // 输出: Promise { 'Done' }

// 1秒后绑定处理程序,依然能拿到之前保存的终值
setTimeout(() => {
  myPromise.then(value => {
    console.log(value); // 输出: Done
  });
}, 1000);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:24:56