今日のトピックは「プロミスとAsync/Await」についてです。JavaScriptで非同期処理を効率的に扱うための重要な概念であり、特にAPI呼び出しやタイマー処理などで広く使用されています。
目次
基本概念の説明
プロミス(Promise)
プロミス(Promise)は、非同期処理の結果を表すオブジェクトで、成功(resolved)または失敗(rejected)を待つことができます。プロミスは、非同期処理が完了したときにthen
やcatch
メソッドで結果を処理します。
Async/Await
Async/Awaitは、プロミスをさらに扱いやすくする構文糖で、非同期処理をまるで同期処理のように書くことができます。async
関数内でawait
を使うことで、プロミスの結果を待ってから次の処理を実行できます。
各言語でのサンプルコード
JavaScript (Promise):
// プロミスの例
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("データ取得完了");
}, 1000);
});
}
// プロミスを使用した非同期処理
fetchData()
.then(result => {
console.log(result); // データ取得完了
})
.catch(error => {
console.error(error);
});
JavaScript (Async/Await):
// Async/Awaitの例
async function fetchDataAsync() {
try {
const result = await fetchData();
console.log(result); // データ取得完了
} catch (error) {
console.error(error);
}
}
// Async/Awaitを使用した非同期処理
fetchDataAsync();
Python (Async/Await):
import asyncio
# 非同期関数の例
async def fetch_data():
await asyncio.sleep(1)
return "データ取得完了"
# Async/Awaitを使用した非同期処理
async def main():
try:
result = await fetch_data()
print(result) # データ取得完了
except Exception as e:
print(e)
# 非同期処理の実行
asyncio.run(main())
C#:
using System;
using System.Threading.Tasks;
class Program
{
// 非同期メソッドの例
public static async Task<string> FetchDataAsync()
{
await Task.Delay(1000); // 1秒待つ
return "データ取得完了";
}
// 非同期メソッドを呼び出す例
public static async Task Main(string[] args)
{
try
{
string result = await FetchDataAsync();
Console.WriteLine(result); // データ取得完了
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
Java (CompletableFuture):
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main {
// 非同期メソッドの例
public static CompletableFuture<String> fetchDataAsync() {
return CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(1); // 1秒待つ
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "データ取得完了";
});
}
// 非同期メソッドを呼び出す例
public static void main(String[] args) {
fetchDataAsync()
.thenAccept(result -> System.out.println(result)) // データ取得完了
.exceptionally(e -> {
System.out.println(e.getMessage());
return null;
});
}
}
各言語の解説
言語 | 非同期処理の実装方法 | ポイント |
---|---|---|
JavaScript | プロミスとAsync/Awaitを使用 | 非同期処理を直感的に扱えるが、エラーハンドリングに注意が必要 |
Python | Async/Awaitで非同期処理をサポート | asyncio ライブラリを使い、協調的なタスク管理が可能 |
C# | async とawait で非同期タスクを管理 | 非同期処理の中でもエレガントにコードが書ける |
Java | CompletableFuture で非同期処理を実現 | 非同期処理の結果をハンドルしやすいが、やや複雑になることも |
まとめ
プロミスとAsync/Awaitは、非同期処理を効率的に行うための強力なツールです。今日紹介した各言語での実装方法を理解し、効果的に活用することで、非同期処理が必要な場面でコードの可読性と保守性を向上させることができます。次回は、さらに高度な非同期処理のテクニックについて学びます。
コメント