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 并恢复上下文。
相关推荐
ssshooter6 分钟前
看完就懂 useSyncExternalStore
前端·javascript·react.js
Live000002 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉2 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化
球球pick小樱花2 小时前
游戏官网前端工具库:海内外案例解析
前端·javascript·css
喝水的长颈鹿2 小时前
【大白话前端 02】网页从解析到绘制的全流程
前端·javascript
用户14536981458782 小时前
VersionCheck.js - 让前端版本更新变得简单优雅
前端·javascript
codingWhat2 小时前
整理「祖传」代码,就是在开发脚手架?
前端·javascript·node.js
码路飞2 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
Lee川2 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
颜酱3 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法