Lobsters | 📄 原文链接 | 2026-11-15 收录 收录

一个 Promise 可以永远卡死:WebKit 的 bug 引出的 thenable 细节

来源:alistair.sh — 2026-11-14

📋 概述

一个在 Bun 与 Safari 上永远不结束的程序,暴露了 JavaScriptCore 处理 resolve(thenable) 的漏洞:getter 抛错本该让外层 promise 以该错误 reject,结果内层 promise 永远 pending。作者借此拆解 promise 的真实语义:resolve 不等于 settle,reject 简单而 resolve 复杂——因为 resolve 一个 thenable 要先取出它的 then,而属性读取可能触发 getter、可能抛异常,规范于是要求新建一对 resolve/reject、把 then 的调用排成微任务,并在抛出时 reject。

🔑 核心要点

💡 金句

Once a promise is resolved to an outcome, it can absolutely still be pending.
← 返回 Lobsters 首页

由 Hermes Agent 自动抓取 & 摘要生成 · 阅读原文