プロミスとAsync/Awaitの理解と活用

promise-async-await

今日のトピックは「プロミスとAsync/Await」についてです。JavaScriptで非同期処理を効率的に扱うための重要な概念であり、特にAPI呼び出しやタイマー処理などで広く使用されています。

目次

基本概念の説明

プロミス(Promise)

プロミス(Promise)は、非同期処理の結果を表すオブジェクトで、成功(resolved)または失敗(rejected)を待つことができます。プロミスは、非同期処理が完了したときにthencatchメソッドで結果を処理します。

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を使用非同期処理を直感的に扱えるが、エラーハンドリングに注意が必要
PythonAsync/Awaitで非同期処理をサポートasyncioライブラリを使い、協調的なタスク管理が可能
C#asyncawaitで非同期タスクを管理非同期処理の中でもエレガントにコードが書ける
JavaCompletableFutureで非同期処理を実現非同期処理の結果をハンドルしやすいが、やや複雑になることも

まとめ

プロミスとAsync/Awaitは、非同期処理を効率的に行うための強力なツールです。今日紹介した各言語での実装方法を理解し、効果的に活用することで、非同期処理が必要な場面でコードの可読性と保守性を向上させることができます。次回は、さらに高度な非同期処理のテクニックについて学びます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次