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 并恢复上下文。
相关推荐
哈__2 小时前
React Native 鸿蒙跨平台开发:PixelRatio 像素适配
javascript·react native·react.js
用户6387994773052 小时前
每组件(Per-Component)与集中式(Centralized)i18n
前端·javascript
DarkLONGLOVE2 小时前
Vue组件使用三步走:创建、注册、使用(Vue2/Vue3双版本详解)
前端·javascript·vue.js
DarkLONGLOVE2 小时前
手把手教你玩转Vue组件:创建、注册、使用三步曲!
前端·javascript·vue.js
冴羽4 小时前
2026 年前端必须掌握的 4 个 CSS 新特性!
前端·javascript·css
狗头大军之江苏分军4 小时前
告别旧生态:Ant Design 6 不再支持 IE 与现代前端趋势解读
前端·javascript·后端
Highcharts.js4 小时前
Highcharts Grid 表格/网格安装 |官方安装文档说明
开发语言·javascript·表格组件·highcharts·官方文档·安装说明·网格组件
3824278275 小时前
表单提交验证:onsubmit与return详解
前端·javascript·html
bug总结5 小时前
身份证号脱敏的正确实现
前端·javascript·vue.js
林太白5 小时前
Vite8 Beta来了,Rolldown携手Oxc
前端·javascript·后端