发布时间:2025 年 1 月 17 日
在 Web 上执行异步工作可能具有挑战性,而 Web 上执行的许多工作都涉及异步性。无论是涉及 fetch
调用还是其他异步操作,当内置方法提供强大的错误处理功能时,浏览器都会简化执行这些工作的方式。我们已经为使用 then
、catch
和 finally
方法的 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);
然后,使用 then
、catch
和 finally
方法处理 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 平台中稳定且可互操作的一部分。