JavaScript/async/await
async/await
[編集]async と await は、非同期処理をより簡潔かつ直感的に扱うための JavaScript の構文です。これらは、非同期コードを同期的に書くことを可能にし、コールバックや Promise の .then() メソッドを使うよりも、コードの可読性を向上させます。async/await は、非同期関数を作成し、非同期操作を待機するために使用されます。
async
[編集]async キーワードは、非同期関数を定義するために使用されます。非同期関数は常に Promise を返します。もし関数内で return があれば、その値は Promise.resolve() にラップされて返されます。
構文
[編集]async function example() { return 'Hello, world!'; } example().then(result => console.log(result)); // 'Hello, world!'
この例では、async キーワードを使って example 関数を定義し、その戻り値は自動的に Promise になります。return が呼ばれると、`Promise.resolve('Hello, world!')` としてラップされます。
await
[編集]await キーワードは、async 関数内で使用され、Promise が解決または拒否されるのを待機するために使われます。await は非同期処理を同期的に書くために使用され、非同期関数の実行を一時的に停止させ、Promise が解決されるまで次の行のコードは実行されません。
構文
[編集]async function fetchData() { let response = await fetch('https://api.example.com/data'); let data = await response.json(); console.log(data); }
この例では、await が fetch() 呼び出しを待機し、レスポンスを受け取ってから次の行で json() メソッドを実行します。await は Promise が解決されるまで、非同期関数の実行を停止します。
async/await の組み合わせ
[編集]async 関数内で await を使うことで、非同期コードが直線的に書かれるようになり、コールバックや .then() を使うよりも読みやすくなります。
async function fetchUserData() { try { let userResponse = await fetch('https://api.example.com/user'); let user = await userResponse.json(); let postsResponse = await fetch(`https://api.example.com/posts/${user.id}`); let posts = await postsResponse.json(); console.log(posts); } catch (error) { console.error('Error:', error); } }
ここでは、await を使って順番に非同期操作を行い、ユーザー情報を取得してからその情報に基づいて別の API 呼び出しを行っています。また、try/catch ブロックを使ってエラーハンドリングも行っています。
非同期関数のエラーハンドリング
[編集]非同期関数内でのエラーハンドリングは、try/catch を使って行います。await の呼び出しで発生したエラーは、try/catch ブロックで捕まえることができます。
構文
[編集]async function getData() { try { let response = await fetch('https://api.example.com/data'); let data = await response.json(); console.log(data); } catch (error) { console.error('Failed to fetch data:', error); } }
ここでは、fetch() 呼び出しやその後の操作が失敗した場合に、エラーが catch ブロックで処理されます。
async/await と Promise
[編集]async/await は、実際には Promise のラッパーです。async 関数は常に Promise を返し、await は Promise が解決するまで待機します。以下の例のように、Promise を直接操作することと、async/await を使うことは同じ効果を得ることができます。
function fetchData() { return fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); } fetchData();
async/await の例
[編集]async function fetchData() { try { let response = await fetch('https://api.example.com/data'); let data = await response.json(); console.log(data); } catch (error) { console.error('Error:', error); } } fetchData();
どちらの方法も同じ結果を得られますが、async/await を使うことでコードの可読性が向上し、非同期操作の順番を直感的に理解することができます。
使用シーン
[編集]- 非同期処理の簡素化: 非同期処理を同期的に書けるため、コードがシンプルで可読性が高くなります。
- エラーハンドリング:
try/catchを使って非同期操作のエラーを簡単に扱うことができます。 - 順番に処理を行いたい場合: 非同期操作を順番に行う際、
awaitを使うことで処理の順序が直感的に分かりやすくなります。
注意点
[編集]awaitはasync関数内でのみ使用できます。非同期関数でない場所でawaitを使うと、エラーが発生します。awaitはPromiseが解決されるまで待機するため、非同期処理の並列実行には適していません。並列処理を行いたい場合は、Promise.all()などを使います。