v8源码:PromiseResolveThenableJobTask 是如何被创建和执行的?

源码追踪

下面我来按照执行流程分步说明 PromiseResolveThenableJobTask 微任务是如何被创建、入队并执行的:

1. 触发点 --- PromiseResolve 发现 resolution 是 thenable

  • 逻辑在 promise::ResolvePromise 中:当 resolution 不是原生 fulfilled 值且有可调用的 then 时,会进入 Enqueue 分支,创建任务并入队(见 Enqueue 段)。

2. 创建任务对象 NewPromiseResolveThenableJobTask

3. 入队(HostEnqueuePromiseJob / EnqueueMicrotask)


4. 任务在微任务循环中被取出并分发执行

5. RunSingleMicrotask 中对 PromiseResolveThenableJobTask 的处理路径

6. PromiseResolveThenableJob 的真正语义(builtin 实现)

7. 相关的对象层次 & 其它点

  • 在 C++ 层,JSPromise::Resolve 在某些路径会调用工厂创建并入队任务(见 JSPromise::Resolve 中创建 NewPromiseResolveThenableJobTask 并把任务放到 microtask_queue->EnqueueMicrotask(*task) 的实现)。

总结(简短流程):

  1. PromiseResolve 发现 resolution 是 thenable -> 调用 NewPromiseResolveThenableJobTask 创建任务并设置 task.context=then 的 realm(promise-resolve.tq/promise-misc.tq)。
  2. 通过 EnqueueMicrotask(task.context, task) 将任务放入对应 native context 的 MicrotaskQueue(builtins-microtask-queue-gen.cc 的 EnqueueMicrotask)。
  3. RunMicrotasks 循环取出任务并调用 RunSingleMicrotask
  4. 对于 PromiseResolveThenableJobTask 分支,先触发 before-hook,再执行 builtin PromiseResolveThenableJob(在 promise-jobs.tq 中实现 then 调用 -- PerformPromiseThen 的语义),最后触发 after-hook 并恢复上下文。
相关推荐
@yanyu66617 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
@大迁世界18 小时前
2026年React大洗牌:React Hooks 将迎来重大升级
前端·javascript·react.js·前端框架·ecmascript
风止何安啊18 小时前
为什么要有 TypeScript?让 JS 告别 “薛定谔的 Bug”
前端·javascript·面试
海天鹰19 小时前
SOC架构
javascript
前进的李工19 小时前
MySQL角色管理:权限控制全攻略
前端·javascript·数据库·mysql
NPE~20 小时前
[App逆向]环境搭建下篇 — — 逆向源码+hook实战
android·javascript·python·教程·逆向·hook·逆向分析
洒满阳光的庄园20 小时前
Electron 桌面端打包流程说明
前端·javascript·electron
子琦啊20 小时前
【算法复习】数组与双指针篇
javascript·算法
SuperEugene20 小时前
前端通用基础组件设计:按钮/输入框/弹窗,统一设计标准|组件化设计基础篇
前端·javascript·vue.js·架构
范什么特西20 小时前
web练习
java·前端·javascript