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 并恢复上下文。
相关推荐
www_stdio1 小时前
深入理解 Promise 与 JavaScript 原型链:从基础到实践
前端·javascript·promise
Tzarevich1 小时前
JavaScript 作用域与执行机制:从变量提升到块级作用域的演进
javascript·v8
kevinzzzzzz1 小时前
基于模块联邦打通多系统的探索
前端·javascript
季禮祥1 小时前
彻底弄懂KeepAlive
javascript·vue.js·面试
灵魂学者2 小时前
Vue3.x —— ref 的使用
前端·javascript·vue.js
梦6502 小时前
VUE树形菜单组件如何实现展开/收起、全选/取消功能
前端·javascript·vue.js
我命由我123452 小时前
微信小程序 - 避免在 data 初始化中引用全局变量
开发语言·前端·javascript·微信小程序·小程序·前端框架·js
低保和光头哪个先来2 小时前
基于 Vue3 + Electron 的离线图片缓存方案
前端·javascript·electron