カテゴリ: React 更新日: 2025/12/02

ReactのuseEffectで複数の非同期処理を扱う方法!初心者でもわかるベストプラクティス

useEffectで複数の非同期処理を扱う方法
useEffectで複数の非同期処理を扱う方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Reactでデータを取得するときに、複数の非同期処理を一度に扱いたいんですが、どうすればいいですか?」

先生

「いい質問ですね。ReactのuseEffectでは、非同期処理を組み合わせる方法がいくつかあります。例えばAPIを二つ呼び出して両方のデータを画面に表示することができます。」

生徒

「二つのAPIを同時に呼び出すんですか?なんだか難しそうです…」

先生

「大丈夫です。初心者でもわかるように、ゆっくり具体例を交えて説明しますね。」

1. 非同期処理とは?

1. 非同期処理とは?
1. 非同期処理とは?

非同期処理とは「終わるまで待たずに進める処理」のことです。例えば友達にメールを送って返事を待たずに別の作業をするようなイメージです。Reactではfetchなどを使ってサーバーからデータを取ってくるときに非同期処理を使います。

一方で複数の非同期処理を同時に行う場合、「どの順番で終わるか分からない」という特徴があります。そこでPromise.allなどを使って「全部の処理が終わるまで待つ」という方法がよく使われます。

2. useEffectで非同期処理を書くときの注意

2. useEffectで非同期処理を書くときの注意
2. useEffectで非同期処理を書くときの注意

useEffectはコンポーネントが描画されたときに実行される関数ですが、直接asyncを付けることはできません。そのため、中で非同期関数を定義して呼び出す必要があります。

また、複数の非同期処理を扱うときには「途中でエラーが出たらどうするか」や「片方だけ失敗したときにどう表示するか」といった設計も大事です。初心者の方はまず基本のPromise.allを使った方法を覚えるのがおすすめです。

3. 複数のAPIを同時に呼び出す例

3. 複数のAPIを同時に呼び出す例
3. 複数のAPIを同時に呼び出す例

ここでは「ユーザー情報」と「投稿データ」を同時に取得して画面に表示する例を紹介します。


import React, { useState, useEffect } from "react";

function MultiFetch() {
  const [user, setUser] = useState(null);
  const [post, setPost] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const [userRes, postRes] = await Promise.all([
          fetch("https://jsonplaceholder.typicode.com/users/1"),
          fetch("https://jsonplaceholder.typicode.com/posts/1")
        ]);
        const userData = await userRes.json();
        const postData = await postRes.json();
        setUser(userData);
        setPost(postData);
      } catch (error) {
        console.error("データの取得に失敗しました", error);
      }
    };
    fetchData();
  }, []);

  return (
    <div>
      <h1>{user ? user.name : "ユーザー読み込み中..."}</h1>
      <p>{post ? post.title : "投稿読み込み中..."}</p>
    </div>
  );
}

export default MultiFetch;
(画面には「ユーザーの名前」と「投稿のタイトル」が表示されます。読み込み中は「読み込み中...」と表示されます)

4. 処理を順番に実行したい場合

4. 処理を順番に実行したい場合
4. 処理を順番に実行したい場合

ときには「一つ目のAPIが終わってから二つ目を呼びたい」というケースもあります。例えばユーザーのIDを取得してから、そのIDを使って別のデータを取る場合です。そのときはawaitを順番に書くことで実現できます。


useEffect(() => {
  const fetchSequential = async () => {
    try {
      const userRes = await fetch("https://jsonplaceholder.typicode.com/users/1");
      const userData = await userRes.json();
      setUser(userData);

      const postRes = await fetch(
        `https://jsonplaceholder.typicode.com/posts/${userData.id}`
      );
      const postData = await postRes.json();
      setPost(postData);
    } catch (error) {
      console.error("順番に取得中にエラー", error);
    }
  };
  fetchSequential();
}, []);

このようにすれば、まずユーザー情報を取ってから、そのユーザーに関連する投稿を取得することができます。

5. 複数の非同期処理で気をつけること

5. 複数の非同期処理で気をつけること
5. 複数の非同期処理で気をつけること
  • すべて成功しないと困る場合はPromise.allを使う
  • 一部でも成功すればよい場合はPromise.allSettledを使う
  • 長時間かかる処理ではローディング状態を管理する
  • エラーが起きても画面が止まらないように工夫する

これらを意識すれば、初心者でも複数の非同期処理を安心して扱えるようになります。特にuseEffectの中では「開始」「成功」「失敗」の3つをセットで考えると分かりやすいです。

6. まとめとして覚えておきたい考え方

6. まとめとして覚えておきたい考え方
6. まとめとして覚えておきたい考え方

複数の非同期処理を扱うときのコツは「待つべきところは待つ」「並列にできるところは並列にする」という考え方です。これは日常生活にも似ています。例えば料理をするときに、炊飯器でご飯を炊きながらスープを作れば効率が良いですが、材料を切らないと始められない作業は順番にやる必要があります。

ReactのuseEffectも同じで、複数の非同期処理をどう組み合わせるかを考えることが大切です。

カテゴリの一覧へ
新着記事
New1
React
Reactコンポーネントの再利用と分割を完全マスター!初心者でもわかるコンポーネント設計
New2
React
ReactでAxiosインターセプターの使い方を完全ガイド!初心者でもわかるリクエストとレスポンスの処理方法
New3
React
JSXの書き方!初心者でもわかるReactタグと属性の基本ルール解説
New4
React
ReactとDockerを使った開発環境構築の基本を徹底解説!初心者でもわかるReactとDockerの連携方法
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
Reactのイベントハンドリングのアンチパターンまとめ!初心者でもわかる注意点
No.4
Java&Spring記事人気No4
React
Reactのカスタムフックの作り方を完全ガイド!再利用可能なロジックを切り出す仕組み
No.5
Java&Spring記事人気No5
React
ReactでFetch APIのローディング状態を管理する方法|初心者にもわかる解説
No.6
Java&Spring記事人気No6
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.8
Java&Spring記事人気No8
React
Reactでファイルアップロードを実装する方法を解説!Fetch APIで画像やPDFを送る仕組みを初心者向けに紹介