For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/year/pending/proposal-native-promise-predicate.md.
  • 简体中文
  • Native Promise Predicate S2

    中文标题:原生 Promise 谓词

    提案概览
    提案速览

    该提案引入了 Promise.isPromise,一个新的谓词,暴露内部 IsPromise 抽象操作的结果,允许无副作用地检测原生 promise。它解决了当前模式如 Promise.resolve(val) === val 的局限性,这些模式会分配不必要的 promise 并可能触发 thenable 同化。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    Promise.isPromise

    ECMAScript 提案与规范,关于 Promise.isPromise。

    状态

    TC39 流程

    阶段:2

    ** Champion **:

    动机

    目前,在没有副作用的情况下检查一个对象是否是原生 promise 是不可能的。通常的做法是测试 Promise.resolve(val) === val,但在否定的情况下,它会创建一个由 val 解析出的新 promise。除了不必要的分配,它还可能触发与 thenable 同化机制 相关的用户代码。

    希望进行防御性编程的代码,例如在异步逻辑中处理未知值时避免同步重入,目前只能通过付出一个 tick 的代价(Promise.resolve().then(() => val))来实现,即使该值是安全的原生 promise。

    当执行 await val 时,原生 promise 的内部状态会被安全地采用,如果 https://github.com/tc39/ecma262/pull/3689 被接受,对于其他 promise 解析路径也是如此。

    instanceof Promise 是不合适的,因为它检查的是 Promise.prototype 是否在值的原型链中,而不是检查该值是否通过了规范内部执行的 IsPromise 检查。

    提案

    一个新的 Promise.isPromise 谓词,暴露 IsPromise 抽象操作的结果。

    先例

    Error.isError 对原生 Error 对象做了类似的品牌检查。

    膜透明性

    与 Error 类似,Promise 也是更适合“通过复制传递”而不是通过膜进行代理的对象。此外,已经可以通过 Promise.resolve() 异步检测一个对象是否是原生 promise。

    Promise.isPromise 谓词实际上可以让膜检测那些应该在另一侧重建的 promise 值。