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/stage/4/proposal-promise-try.md.
  • 简体中文
  • Promise.try S4

    提案概览
    提案速览

    该提案引入了 Promise.try,一个调用函数并返回 promise 的方法,通过 promise 语义处理同步返回值或抛出的异常。它避免了 Promise.resolve().then(f) 的额外微任务延迟,镜像了 async function 到第一个 await 的执行。

    Note

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

    Promise.try

    ECMAScript 提案、规范和 Promise.try 的参考实现

    规范由 @ljharb 起草。

    该提案目前处于 流程第 4 阶段

    理由

    我和许多其他人都有一个常见的用例:我有一个函数 f。这个函数可能是异步的,返回一个 Promise,也可能不是——我不想必须知道。然而,我想把它包装在一个 Promise 中,这样如果它 异步的,或者它抛出了异常,我就可以依靠 Promise 语义和 .catch 来处理它。

    在 JS Promises 中实现这一点的典型“易于记忆”的方式是 Promise.resolve().then(f)。这很有效!它会捕获任何抛出的异常,并将函数返回的任何 thenable 或值包装成 Promise。但是,f 会被不必要地异步运行,在未来的一个 tick 中执行。

    如果我想要 f 在同一个 tick 中运行——因为毕竟它可能同步返回一个值——或者如果我想要与 async function 在第一个 await 之前具有并行语义——那么我需要使用 new Promise(resolve => resolve(f()))。这达到了我的目标,但写起来不人性化,也不容易记住。

    使用 Promise.try(f),我可以获得与上面那堆 new Promise 相同的语义,很好地镜像 async function,允许乐观地同步但安全地执行函数,并且之后能够使用 Promise。耶!

    用户态实现

    进一步阅读

    命名

    最常见的名称是 try,它与语法上的 try 块有清晰的平行关系。常见的替代名称是 attempt,但这主要是为了 ES3 兼容性,这里不需要。

    规范

    您可以查看以 HTML 形式呈现的规范。

    Polyfills