Promise创建时执行器接收的resolve和reject函数是什么?
关于Promise执行器中resolve/reject函数的本质
这是个非常好的问题——很多开发者刚开始深入Promise机制时都会有这个疑惑!咱们一步步拆解清楚:
核心结论
执行器函数被调用时传入的resolve和reject,是Promise规范/引擎内部实现的内置函数,它们的唯一职责就是修改当前Promise对象的状态,和你后续通过.then/.catch绑定的处理程序没有直接的预绑定关系。
详细解释
状态修改的核心作用
这两个函数的本质是用来改变Promise的内部状态:- 调用
resolve(值):会把Promise从pending(待定)状态切换为fulfilled(已兑现),同时把你传入的值保存为Promise的"终值"(eventual value)。 - 调用
reject(原因):会把Promise从pending状态切换为rejected(已拒绝),同时把你传入的错误/原因保存为Promise的"拒因"(reason)。
- 调用
状态与处理程序的解耦
即使你还没有通过.then/.catch绑定任何处理程序,调用resolve或reject依然会正常修改Promise的状态——因为Promise的状态是自身内部维护的,和是否有监听它的处理程序无关。
当后续你绑定处理程序时:- 如果Promise已经是
fulfilled状态,.then的成功回调会立即执行,用上之前保存的终值。 - 如果Promise已经是
rejected状态,.catch的失败回调会立即执行,用上之前保存的拒因。
- 如果Promise已经是
内部逻辑的简化理解
你可以把这两个函数的内部逻辑想象成(简化版):- 首先检查当前Promise的状态,如果已经不是
pending(状态不可逆),直接忽略调用。 - 如果是
pending,就更新状态并保存终值/拒因。 - 此时如果已经有通过
.then/.catch注册的处理程序,就把这些处理程序放到微任务队列等待执行;如果还没有注册处理程序,就把状态和值暂存起来,等后续注册时再触发对应的回调。
- 首先检查当前Promise的状态,如果已经不是
示例代码验证
// 创建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
相关产品推荐
相关产品推荐

