TypeScriptにおけるasync/await
この記事ではTypeScriptにおけるasync/awaitについて説明します。
YouTube Video
TypeScriptにおけるasync/await
TypeScriptにおけるasync
は、非同期処理を簡潔に記述するためのキーワードで、JavaScriptのasync
/await
構文と同様の動作をします。async
関数は、Promiseを返す関数をより直感的に扱えるように設計されています。
async
関数の基本
async
キーワードを使って宣言された関数は、常にPromise
を返します。以下はその基本的な例です。
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
この例では、async
関数は常にPromise
を返すため、return
された値は自動的にPromise.resolve
されます。つまり、"Data received"
はPromise<string>
となり、非同期処理として扱われます。
await
キーワード
await
キーワードは、async
関数内でしか使えません。これは、Promise
の結果が返ってくるまで関数の実行を一時停止し、待機する機能を提供します。
次の例では、fetch
を使った非同期処理をasync
/await
で記述しています。
1async function getUserData() {
2 try {
3 const response = await fetch("https://codesparklab.com/json/example.json");
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error("Error fetching user data:", error);
8 }
9}
10
11getUserData();
この例では、await
を使ってfetch
関数が返すPromise
の完了を待ち、その結果を変数response
に代入します。さらに、response.json()
の結果もawait
で待機します。
async
/await
のエラーハンドリング
非同期処理中に発生するエラーは、通常のtry...catch
構文を使ってキャッチできます。await
の部分でエラーが発生した場合、catch
ブロックでそのエラーを処理します。
1async function fetchDataWithErrorHandling() {
2 try {
3 const response = await fetch('https://invalid.codesparklab.com/');
4 if (!response.ok) {
5 throw new Error(`HTTP error! status: ${response.status}`);
6 }
7 const data = await response.json();
8 console.log(data);
9 } catch (error) {
10 console.error("Fetch error:", error);
11 }
12}
13
14fetchDataWithErrorHandling();
上記の例では、await
によってfetch
関数の結果を待機しつつ、エラーが発生した場合にtry...catch
でエラーを処理しています。
async
/await
の利点
-
直感的な非同期処理:
async
/await
を使うことで、Promise
チェーン(then
やcatch
)を使った場合よりもコードの流れが直感的で、同期処理のように記述できる。 -
エラーハンドリングが簡単:
try...catch
を使うことで、非同期処理におけるエラーハンドリングがシンプルになります。Promise
チェーンを使うよりも読みやすいコードが書けます。
async
関数の戻り値
async
関数は常にPromise
を返します。そのため、明示的にPromise
を返さなくても、async
キーワードを使えば非同期処理が可能です。
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
上記のコードでは、42
という同期的な値が返されていますが、async
関数内であるため、自動的にPromise.resolve(42)
に変換されます。
非同期関数の連続実行
複数の非同期関数を連続して実行する場合は、await
を使ってその順序を制御できます。
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function processData() {
19 const data1 = await fetchData1();
20 console.log(data1);
21
22 const data2 = await fetchData2();
23 console.log(data2);
24}
25
26processData();
この例では、fetchData1
の完了を待ってからfetchData2
を実行しています。これはPromise
チェーンを使った方法に比べてコードの可読性が高いです。
並列実行
非同期処理を並列で実行したい場合、Promise.all
を使って同時に複数のPromise
を処理できます。
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function fetchMultipleData() {
19 const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
20 console.log(data1);
21 console.log(data2);
22}
23
24fetchMultipleData();
この場合、fetchData1
とfetchData2
が同時に実行され、両方が解決されるのを待ってから処理を進めます。これにより、効率的に複数の非同期処理を行うことができます。
まとめ
async
関数はPromise
を返し、await
キーワードを使うことで非同期処理の結果を待機します。try...catch
を使うことで、非同期処理におけるエラーハンドリングが簡単になります。Promise.all
を使うことで、複数の非同期処理を並列に実行することが可能です。
async
/await
は非同期処理をよりシンプルに記述できるため、TypeScriptやJavaScriptで広く使用されています。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。