Promise.try 現已成為 Baseline

Jeremy Wagner
Jeremy Wagner

發布日期:2025 年 1 月 17 日

在網路上執行非同步工作可能會很困難,而且網路上執行的許多工作都涉及非同步作業。無論是 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 已達到新基準,因此您應該可以在所有主要瀏覽器引擎中使用。隨著時間過去,您應該會越來越有信心在網頁應用程式中使用 Promise.try,因為 Promise.try 將成為穩定且可互通的網頁平台元件。