Promise — *非同期の標準*
Promise — *非同期の標準*
🎯 このlessonを読み終えたら
このlessonを読み終えると、以下の3つを自信を持って行えるようになります。
- ▸✅ Pending → Fulfilled / Rejected の状態遷移
- ▸✅ .then / .catch / .finally のチェーン
- ▸✅ Promise.all · race · any · allSettled の違い
学習目標をチェックリストとして手元に置き、すべて答えられるようになったらlessonを閉じてください。
Promiseとは何か
核心を一言で
Promise = 「今は結果がないが、後で渡すと約束した」オブジェクト。非同期処理の標準。コールバック地獄を解決した2015年ES6の大きな進歩。
コールバック地獄 — 旧来の方式
コールバックの中にコールバックの中にコールバック...ピラミッドのようにインデントが増殖。コールバック地獄。
Promiseの方式
javascriptconst wait = (ms) => new Promise(r => setTimeout(r, ms));
const fetchUser = (id) => wait(50).then(() => ({ id, name: 'ホン' }));
const fetchOrders = (uid) => wait(50).then(() => [{ id: 1 }, { id: 2 }]);
const fetchItems = (oid) => wait(50).then(() => [{ name: '本' }]);
const handle = (err) => console.error('失敗:', err);
const id = 42;
fetchUser(id)
.then(user => fetchOrders(user.id))
.then(orders => fetchItems(orders[0].id))
チェーンで水平的に。エラーも末尾の一度のcatchだけで処理。
Promiseの3つの状態
一度fulfilledまたはrejectedになると変更不可。
よく使われるPromise
javascriptconst wait = (ms) => new Promise(r => setTimeout(r, ms));
wait(1000).then(() => console.log("1秒後"));
// Promise.resolve — すでに完了したPromise
const p = Promise.resolve(42);
p.then(v => console.log(v)); // 42
javascript// 🧪 偽API (コピペ可能に)
const wait = (ms) => new Promise(r => setTimeout(r, ms));
const fetchUser = (id) => wait(50).then(() => ({ id, name: 'ホン' }));
const fetchOrders = (id) => wait(50).then(() => [{ orderId: 1 }]);
3つのリクエストを同時に開始 → すべて完了した時点で結果を返す。直列の3倍高速。
注意: 一つでも失敗すると全体が失敗。部分的な失敗を許容する場合はPromise.allSettledを使用:
Promise.race — 最速の一つ
よくある落とし穴
1. catchの漏れ:
処理されていないPromise rejectionはUnhandled Promise Rejection警告を出す。必ずcatchすること。
2. then内でさらにthenをネスト:
3. awaitの代わりにthenを使いすぎる:
現在はasync/awaitが標準。thenチェーンはシンプルなケースのみ。
まとめ
- ▸Promise = 将来の結果を約束するオブジェクト
- ▸
then·catch·finallyチェーン - ▸
Promise.allで並列処理 - ▸モダンなコードはasync/awaitでよりすっきりと
⚡ 実際に試してみよう — Promiseチェーン + Promise.all
🤖 AIにこう依頼してみよう
このlessonの概念を理解していれば、AIに具体的に指示できます。漠然とした「直して」ではなく、語彙のある依頼 — それがトークン節約の出発点です。
- ▸「この.thenチェーンをasync/awaitに書き換えて」
- ▸「このコードのunhandled rejectionの可能性を.catch / try-catchで防いで」
- ▸「これらのfetchをPromise.allで並列化して」
なぜこれがトークンを節約するのか
概念を知らないと、AIの回答を受け取っても「それって何ですか?」とまた聞き直す必要があります。その「聞き直し」がトークンを消費します。概念を一度習得しておけば、会話が一度で終わります。