Promise.try がベースラインで新たに利用可能に

Jeremy Wagner
Jeremy Wagner

公開日: 2025 年 1 月 17 日

ウェブで非同期処理を行うことは困難な場合があります。ウェブで行う多くの処理には非同期処理が伴います。fetch 呼び出しやその他の非同期オペレーションが関係しているかどうかにかかわらず、組み込みメソッドで堅牢なエラー処理が提供されている場合、ブラウザによってその処理方法が容易になります。これは、thencatchfinally メソッドを使用する Promise ですでに提供されています。

それでも、アプリケーションのコードベースを設計する方法は柔軟である必要があります。アプリケーションで行うすべての処理が非同期である必要はありません。Promise に渡したコールバックが同期的か非同期かに関係なく、コールバックの結果をよりシンプルな方法で処理したい場合があります。Promise.try は、すべての主要なブラウザ エンジンで利用できるメソッドであり、デベロッパーがこの処理を簡単に行えるようにします。つまり、ベースラインで新たに利用可能になりました。

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."));

コールバック関数に引数がある場合はどうなりますか?これに対処する方法は 2 つあります。

// 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 はウェブ プラットフォームの安定した相互運用可能な部分になるため、ウェブアプリで安心して使用できるようになります。