1. 5 件のうち公開中の 4 件のタイトルが並ぶ
  2. 空の配列を渡すと空の配列が返る
  3. 公開中が 1 件も無いと空の配列が返る
  4. 公開中が 1 件だけのとき
コース一覧
非同期JavaScript:API通信とモジュール
Promise をつくって返す

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

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

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

Promise をつくって返す

Promise の状態は一度で決まる
解説

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

  • new Promise に渡した関数の中で resolve を呼ぶと、値が確定します
  • Promise は戻り値なので、変数に入れたり関数から返したりできます

呼んだ瞬間には、まだ中身が無い

時間のかかる処理を関数にすると、return で答えを返せません。答えが出るのは何百ミリ秒か先で、return の行はもう過ぎているからです。そこで JavaScript は、値の代わりに「あとで値が入る箱」を返す形にそろえました。これが Promise です。

JavaScript

const box = fetchHeadline(); console.log(box); // Promise { <pending> }

呼んだ瞬間に返ってくるのは箱だけで、中身はまだ空です。この状態を pending と呼びます。大事なのは、この箱そのものが値だという点です。変数に入れられますし、関数から返せますし、配列に並べることもできます。

箱を自分で作る

自分で箱を作るときは new Promise を使い、引数に関数を 1 つ渡します。この関数はすぐその場で実行され、resolve と reject という 2 つの関数を受け取ります。

JavaScript

function wait(ms) { return new Promise(function (resolve) { setTimeout(function () { resolve("待ち終わりました"); }, ms); }); }

resolve("待ち終わりました") を呼んだ瞬間に、箱の中身が確定します。return の位置に注目してください。返しているのは resolve の結果ではなく、new Promise で作った箱そのものです。箱は関数を呼んだ直後に返り、中身だけがあとから入ります。resolve に渡した値がそのまま中身になり、何も渡さなければ undefined になります。

状態意味どうなると移るか
pendingまだ返事が来ていない作った直後はこれ
fulfilled成功の返事が来たresolve が呼ばれた
rejected失敗の返事が来たreject が呼ばれた

pending から動くのは一度きりです。resolve を 2 回呼んでも、2 回目以降は黙って無視されます。エラーにならないぶん気付きにくいので、確定させる場所は 1 つに絞ってください。今回作る箱は必ず成功する側なので、使うのは resolve だけです。

箱を開ける

箱の中身を外から覗く方法はありません。box.text のように書いても取り出せません。中身に触るには await を書きます。await は async を付けた関数の中でだけ使えます。

JavaScript

async function showHeadline() { const text = await wait(100); console.log(text); // 待ち終わりました }

await wait(100) の行で、この関数はいったん中断します。中断しているあいだ作業員は解放されているので、画面は固まりません。中身が確定すると続きから再開し、text に文字列が入ります。await の左の変数に入るのは、箱ではなく中身です。

await が入るより前は、.then に関数を渡して中身を受け取っていました。他人のコードやライブラリの説明で今でもよく見かけるので、対応だけ押さえておきます。

JavaScript

wait(100).then(function (text) { console.log(text); });

then に渡した関数は、中身が確定したときに、その中身を引数として呼ばれます。自分で書くときは await のほうが読みやすいので、then は読めれば十分です。

もう 1 つ、async を付けた関数の戻り値は必ず Promise になります。中で配列を return しても、呼ぶ側が受け取るのは「あとで配列が入る箱」です。だから呼ぶ側にも await が要ります。

よくある間違い

  • resolve を呼び忘れる — 箱は pending のまま永遠に確定せず、await した側も再開しません。エラーが出ないぶん気付けず、採点では時間切れになります。new Promise を書いたら、resolve がどの行で呼ばれるかを必ず目で追ってください
  • 箱のまま使ってしまう — await を書き忘れると、変数に入るのは中身ではなく Promise です。配列やオブジェクトのメソッドが無いというエラーが出たら、まず await の書き忘れを疑ってください

要件

  1. fetchPublishedWorks(works) を作る。new Promise を返し、100 ミリ秒後に published が true の作品だけの配列で resolve する
  2. loadPublishedTitles(works) を async function として作り、fetchPublishedWorks を await する
  3. await した結果から title だけを取り出した配列を返す。公開中が 1 件も無ければ空の配列を返す

入出力例

loadPublishedTitles([{"id":1,"published":true,"title":"プロフィールサイト","views":120,"year":2026},{"id":2,"published":true,"title":"自己紹介カード","views":48,"year":2026},{"id":3,"published":true,"title":"スキル一覧の表","views":32,"year":2026},{"id":4,"published":true,"title":"作品ギャラリー","views":76,"year":2026},{"id":5,"published":false,"title":"学習ログ","views":0,"year":2025}]) → ["プロフィールサイト","自己紹介カード","スキル一覧の表","作品ギャラリー"] loadPublishedTitles([]) → [] loadPublishedTitles([{"id":5,"published":false,"title":"学習ログ","views":0,"year":2025}]) → [] loadPublishedTitles([{"id":1,"published":true,"title":"プロフィールサイト","views":120,"year":2026},{"id":5,"published":false,"title":"学習ログ","views":0,"year":2025}]) → ["プロフィールサイト"]

ヒント

new Promise に渡した関数は resolve を受け取ります。setTimeout の中で resolve を呼ぶと、その時点で箱の中身が決まります

resolve に渡す値がそのまま await の結果になります。ここでは works.filter(...) の結果を渡してください

await を書き忘れると Promise がそのまま変数に入り、map を呼んだところでエラーになります。async function の中でだけ await が使えます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • async と await

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

  • Promise.all で同時に待つ

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

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

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

  • つくる 読み込み中の表示を出す

    300 ミリ秒遅れて届く Promise を自作し、待っているあいだのスピナーと、届いたあとのカード表示を切り替えます。第9章で通信につなぐ前の下ごしらえです。

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

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

  • 関数処理に名前を付けて再利用できる単位
  • Promise非同期の結果を表すラッパーオブジェクト
  • 戻り値呼び出し元への返答を表す点線矢印
  • 変数データに名前をつけて参照する仕組み
  • 処理計算や代入を表す長方形
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 配列サイズ固定の同型データの集まり
  • 引数位置引数=順番で渡す。
main.js
学習モード
エディタを読み込んでいます

メモ

Promise をつくって返す

⌘S で保存