发布时间:2025 年 1 月 17 日
在 Web 上执行异步工作可能具有挑战性,而 Web 上完成的许多工作都涉及异步性。无论这是否涉及到 fetch
调用或其他异步操作,当内置方法提供强大的错误处理时,浏览器会使您更轻松地完成这项工作。这已经通过使用 then
、catch
和 finally
方法为 Promise 提供了支持。
即便如此,您构建应用程序代码库的方式也应该是灵活的,并且您在应用程序中执行的所有操作不一定都是异步的。有时,您可能希望以更简单的方式处理回调的结果,如果传递给 Promise
的回调是同步的还是异步的无关紧要的话。Promise.try
是一种现在所有主要浏览器引擎都可用的方法,它为开发人员简化了这一点,这意味着它现在是 Baseline Newly available。
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
已达到 Baseline Newly available,您应该能够在所有主要浏览器引擎中使用它。随着时间的推移,您应该期望能够更有信心地在您的 Web 应用程序中使用 Promise.try
,因为它将成为 Web 平台的稳定且可互操作的一部分。