コース一覧
非同期JavaScript:API通信とモジュール
同期と非同期

非同期JavaScript:API通信とモジュール

Promise と async/await、非同期エラー、HTTP/REST、fetch による GET、読み込み・成功・失敗の表示、モジュールの読み方を学ぶ全 19 レッスン(380 分)のコースです。最後は承認済みの読み取り専用 API から作品データを取得して表示します。POST はリクエストの組み立てまでで、外部サービスへの書き込みは行いません。

1
非同期処理
0. 同期と非同期15分
1. Promise をつくって返す20分
2. async と await20分
3. Promise.all で同時に待つ20分
4. 非同期のエラーを捕まえる20分
5. つくる 読み込み中の表示を出す30分
6. 第1章まとめクイズ10分
2
fetch で外のデータを使う
0. HTTP と REST の読みかた15分
1. fetch でデータを取る25分
2. 取ったデータを描画する25分
3. response.ok と失敗時の表示25分
4. POST のリクエストを組み立てる20分
5. つくる 作品データを API から読む30分
6. 第2章まとめクイズ10分
3
モジュールと総仕上げ
0. ファイルを分けるという考えかた15分
1. named export と default export15分
2. つくる ポートフォリオアプリを仕上げる40分
3. ここから先の学びかた15分
4. 第3章まとめクイズ10分

非同期JavaScript:API通信とモジュール

01同期と非同期
02Promise をつくって返す
03async と await
04Promise.all で同時に待つ
05非同期のエラーを捕まえる
06つくる 読み込み中の表示を出す
07第1章まとめクイズ
08HTTP と REST の読みかた
09fetch でデータを取る
10取ったデータを描画する
11response.ok と失敗時の表示
12POST のリクエストを組み立てる
13つくる 作品データを API から読む
14第2章まとめクイズ
15ファイルを分けるという考えかた
16named export と default export
17つくる ポートフォリオアプリを仕上げる
18ここから先の学びかた
19第3章まとめクイズ

非同期JavaScript:API通信とモジュール

同期と非同期

同期と非同期
解説

このレッスンで分かること

  • 時間のかかる処理は、待つのではなく予約して先へ進む形で書きます
  • 予約した処理は、いま動いている流れが全部終わってから呼ばれます

3 秒のあいだ、ページを触れなくなる

JavaScript を動かす作業員は 1 人だけです。いま手に持っている仕事をやり切るまで、次の仕事には移れません。ボタンを押したときの処理も、画面を描き直す仕事も、同じ 1 人が順番にこなしています。この人が 1 か所で止まると、ページ全体が止まります。

JavaScript

function waitBadly(seconds) { const end = Date.now() + seconds * 1000; while (Date.now() < end) { // ひたすら現在時刻を確かめ続けるだけ } } console.log("重い処理を始めます"); waitBadly(3); console.log("終わりました");

この while が回っているあいだ、作業員はここに釘付けです。3 秒たつまで、文字を選ぶこともスクロールもできません。待つという行為をこう書いてはいけない、というのが非同期を学ぶ出発点です。

解説

「止まる」と「待つ」は別のことです。止まるのは作業員がその場から動けない状態、待つのは別の仕事に移りながら、返事が来たら戻ってくる状態を指します。非同期処理が扱うのは後者だけです。

予約を置いて、先へ進む

非同期の書き方では、時間のかかる仕事を作業員が抱え込みません。終わったら呼んでくださいと紙に書いて渡し、自分はすぐ次の行へ進みます。入門で使った setTimeout がまさにこれでした。

JavaScript

console.log("1 番目"); setTimeout(function () { console.log("3 番目に出る"); }, 1000); console.log("2 番目");

出力は 1 番目 2 番目 3 番目に出る の順です。setTimeout の行で 1 秒止まるのではなく、予約を置いてすぐ下の行へ進みます。予約した処理が呼ばれるのは、いま動いている流れがすべて終わってからです。書いた順と動く順が一致しないのが非同期のいちばん大きな特徴で、この性質があるおかげでページが固まりません。

同期非同期
書いた行で結果が出るまで止まる予約だけして次の行へ進む
画面はそのあいだ固まる動き続ける
結果を受け取る場所同じ行の戻り値あとから呼ばれる関数の中
代表例filter や sortタイマー、通信、ファイルの読み込み

配列のメソッドは何件あっても、呼んだその行で結果が返ります。一方、通信やファイルの読み込みは、終わるまでにどれくらいかかるか JavaScript 側からは分かりません。分からないから、待つ側が待ち方を選べる形にしてあります。

3 段つなぐと、右へ倒れていく

予約した処理を関数で渡す書き方をコールバックと呼びます。ところが、これだけで順番のある仕事をつなぐと、すぐに読めなくなります。コメントの一覧を取り、その 1 件目の本文を取り、さらに書いた人を取る、という 3 段です。

JavaScript

loadComments(function (comments) { loadBody(comments[0].id, function (body) { loadWriter(body.writerId, function (writer) { console.log(writer.name); }); }); });

3 段でこの深さです。失敗したときの処理を足すと、階層ごとに引数が増えてさらに右へ伸びます。深さそのものより困るのは、失敗の扱いが階層ごとにばらばらになることです。外側の try は、予約した処理が呼ばれるころにはとっくに終わっているので、中で起きた失敗を受け取れません。

この問題を言語の側で片づけたのが Promise です。予約のたびに関数を渡すのではなく、あとで値になる箱を戻り値として受け取る形にそろえました。

JavaScript

const box = loadComments(); // 呼んだ瞬間に箱だけが返る

戻り値なので、変数に入れられますし、関数から返せますし、配列に並べることもできます。コールバックを引数で渡していたときには、どれもできませんでした。

よくある間違い

  • 非同期の結果を、同期のつもりで受け取る — 下のコードはいつでも 0 が出ます。console.log は予約より先に動くからです。値を使う処理は、届いたあとの場所へ移します

JavaScript

let comments = []; setTimeout(function () { comments = [{ body: "はじめまして" }]; }, 100); console.log(comments.length); // 0
  • 待つつもりで空回りのループを書く — 作業員がループに釘付けなので、100 ミリ秒後になっても予約は実行されません。ループを抜けてからようやく動きます

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 非同期完了を待たずに次へ進み、後で結果を受ける
  • 同期処理が終わるまで次に進まない実行順
  • 戻り値呼び出し元への返答を表す点線矢印
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • メソッドクラスに属する関数
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • Promise をつくって返す

    あとで値が入る箱を new Promise で自分の手で作り、戻り値として返します。作った箱を await で開けるところまでを 1 本の関数にまとめます。

  • async と await

    await で Promise の中身が届くのを待ち、前の結果を次の呼び出しに渡します。コールバックの階段が上から下へ読める形になります。

  • Promise.all で同時に待つ

    互いに関係の無い非同期処理をまとめて始め、全部そろうまで 1 回だけ待ちます。待ち時間の合計が、いちばん遅い 1 つぶんまで縮みます。

  • 非同期のエラーを捕まえる

    reject された Promise は await した行で例外になります。第6章の try と catch をそのまま使って受け止め、失敗しても同じ形の値を返します。

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。