JS中Promise的handleSuccess回调如何获取resolve传递的执行结果?
Promise参数传递逻辑原理解答
核心结论
这个参数传递逻辑确实是Promise的内置实现逻辑,resolvedValue、rejectionReason只是社区约定俗成的形参命名,你可以任意修改形参名,不影响取值。
具体实现逻辑
- Promise实例内部有JS引擎外部无法直接访问的内置插槽
[[PromiseStatus]](存储pending/fulfilled/rejected三种状态)和[[PromiseResult]](存储resolve或reject传入的值) - 调用
resolve(值)时,引擎会做三件事:- 将
[[PromiseStatus]]从pending修改为fulfilled - 将传入的参数赋值给内置插槽
[[PromiseResult]] - 遍历所有通过
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
相关产品推荐
相关产品推荐

