Promise.try 现已在基准版中推出

Jeremy Wagner
Jeremy Wagner

发布时间:2025 年 1 月 17 日

在 Web 上执行异步工作可能具有挑战性,而 Web 上执行的许多工作都涉及异步性。无论是涉及 fetch 调用还是其他异步操作,当内置方法提供强大的错误处理功能时,浏览器都会简化执行这些工作的方式。我们已经为使用 thencatchfinally 方法的 Promise 提供了此功能。

即便如此,您构建应用代码库的方式也应灵活,并且您在应用中执行的所有操作不一定都是异步的。有时,您可能希望以更简单的方式处理回调的结果,而不考虑您传递给 Promise 的回调是同步还是异步。Promise.try 是一种目前在所有主流浏览器引擎中都提供的方法,可为开发者简化此过程,这意味着它现在是“新推出的 Baseline”功能。

什么是 Promise.try?它的工作原理是什么?

Promise.try 是一种便捷方法,与使用 Promise.resolve 相比,它可以更轻松地处理同步回调函数的错误:

// If the callback is synchronous and it throws
// an exception, the error won't be caught here:
new Promise(resolve => resolve(callback());

// But it will be here:
Promise.try(callback);

然后,使用 thencatchfinally 方法处理 Promise 的解析或拒绝:

Promise.try(callback)
  .then(result => console.log(result))
  .catch(error => console.log(error))
  .finally(() => console.log("All settled."));

如果回调函数有参数,该怎么办?您可以通过以下两种方式之一来处理此问题:

// This creates an extra closure, but works:
Promise.try(() => callback(param1, param2));

// This doesn't create an extra closure, and still works:
Promise.try(callback, param1, param2);

使用 Promise.try 的主要优势在于,无论您传递给它的回调是同步还是异步,都可以统一使用 Promise。这意味着,如果实用程序函数将回调传递给代码中广泛使用的 Promise,使用 Promise.try 可确保为传递给它的任何回调进行适当的错误处理。如需了解详情以及其他潜在问题或用例,请参阅 Promise.try 的 MDN 文档

总结

现在,Promise.try 已达到“新推出”基准,您应该可以在所有主流浏览器引擎中使用它。随着时间的推移,您应该能够越来越有信心地在 Web 应用中使用 Promise.try,因为它将成为 Web 平台中稳定且可互操作的一部分。