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

JS中Promise的handleSuccess回调如何获取resolve传递的执行结果?

Promise参数传递逻辑原理解答

核心结论

这个参数传递逻辑确实是Promise的内置实现逻辑,resolvedValue、rejectionReason只是社区约定俗成的形参命名,你可以任意修改形参名,不影响取值。

具体实现逻辑

  • Promise实例内部有JS引擎外部无法直接访问的内置插槽[[PromiseStatus]](存储pending/fulfilled/rejected三种状态)和[[PromiseResult]](存储resolve或reject传入的值)
  • 调用resolve(值)时,引擎会做三件事:
    1. 将[[PromiseStatus]]从pending修改为fulfilled
    2. 将传入的参数赋值给内置插槽[[PromiseResult]]
    3. 遍历所有通过then方法注册的成功回调,将[[PromiseResult]]作为实参传入执行
  • 调用reject(原因)的逻辑完全一致,只是状态改为rejected,执行的是then的第二个回调或catch注册的失败回调,传入的是reject的入参

简化版手写实现(方便理解逻辑)

你可以通过下面这个极简的Promise核心实现,直观看到传参逻辑:

class SimplifiedPromise {
  constructor(executor) {
    // 对应内置插槽[[PromiseStatus]]
    this.status = 'pending'
    // 对应内置插槽[[PromiseResult]]
    this.result = null
    // 存储通过then注册的成功、失败回调
    this.successCbs = []
    this.failCbs = []

    // 内置resolve函数
    const resolve = (value) => {
      if (this.status !== 'pending') return
      this.status = 'fulfilled'
      this.result = value
      // 执行所有成功回调,把结果作为参数传入
      this.successCbs.forEach(cb => cb(this.result))
    }

    // 内置reject函数,逻辑和resolve完全一致
    const reject = (reason) => {
      if (this.status !== 'pending') return
      this.status = 'rejected'
      this.result = reason
      this.failCbs.forEach(cb => cb(this.result))
    }

    // 同步执行传入的执行器函数
    executor(resolve, reject)
  }

  then(onFulfilled, onRejected) {
    if (this.status === 'fulfilled') {
      // 已经resolve的情况直接执行回调传参
      onFulfilled(this.result)
    }
    if (this.status === 'rejected' && onRejected) {
      onRejected(this.result)
    }
    // pending状态下先缓存回调
    if (this.status === 'pending') {
      onFulfilled && this.successCbs.push(onFulfilled)
      onRejected && this.failCbs.push(onRejected)
    }
  }
}

// 测试效果和原生Promise完全一致
const prom = new SimplifiedPromise((resolve) => {
  resolve('Yay!');
});
const handleSuccess = (resolvedValue) => {
  console.log(resolvedValue);
};
prom.then(handleSuccess); // 输出 'Yay!'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:48:04