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 并恢复上下文。
相关推荐
一袋米扛几楼9818 分钟前
【报错问题】彻底解决 TypeScript 报错 TS2769: No overload matches this call (JWT 篇)
linux·javascript·typescript
牧码岛1 小时前
Web前端之JavaScrip中的Array、Object、Map和Set详解
前端·javascript·web·web前端
533_1 小时前
[pinia] vue3中监听pinia值的变化
前端·javascript·vue.js
AlenLi1 小时前
JavaScript - 相对实用的Axios二次封装
前端·javascript
一叶飘零晋1 小时前
【(二)Electron 使用之常用技巧】
javascript·electron·ecmascript
小小19922 小时前
vue 单页面请求
开发语言·前端·javascript
hhb_6182 小时前
JavaScript 本地存储与动态数据渲染实战案例
开发语言·javascript·ecmascript
无心使然2 小时前
Openlayers调用ArcGis要素服务之一 ——要素查询 (/query)
前端·javascript·数据可视化
kyriewen112 小时前
Next.js部署:从本地跑得欢,到线上飞得稳
开发语言·前端·javascript·科技·react.js·前端框架·ecmascript
天天向上10242 小时前
openlayers 加载Shapefile文件
前端·javascript·html