Promise
初級読み方:プロミス|英語:Promise
非同期処理の結果を表すオブジェクトで、「後で結果を返すよ」という約束だよ。
やさしい説明
Promise(プロミス)とは、非同期処理の結果を表すオブジェクトです。「約束」という意味で、「処理が完了したら結果を返すよ」という約束を表します。
ネット通販に例えると、注文した瞬間に「配送中」(pending)→ 届いたら「完了」(fulfilled)、届かなかったら「失敗」(rejected)です。
成功時は .then()、失敗時は .catch() で処理を書きます。async/await を使うとさらに読みやすく書けます。
図解:Promiseの3つの状態
具体例・使い方
// APIからデータを取得(.then チェーン)
fetch("https://api.example.com/users")
.then(res => res.json()) // 成功: JSONに変換
.then(data => console.log(data)) // データを使う
.catch(err => console.error("失敗:", err))
.finally(() => console.log("完了")); // 成否に関わらず実行
// async/awaitで書くと読みやすい(同じ処理)
async function getUsers() {
try {
const res = await fetch("https://api.example.com/users");
const data = await res.json();
return data;
} catch (err) {
console.error("失敗:", err);
}
} Promise.all と Promise.allSettled
// Promise.all: 全部成功したら結果を配列で返す
// 1つでも失敗するとcatchに移る
const [user, posts] = await Promise.all([
fetchUser(1),
fetchPosts(1),
]);
// Promise.allSettled: 成否に関わらず全結果を返す
const results = await Promise.allSettled([
fetchUser(1),
fetchPosts(1),
]);
results.forEach(r => {
if (r.status === "fulfilled") console.log(r.value);
else console.error(r.reason);
}); 独立した複数のAPI呼び出しは Promise.all() で並列実行すると速くなります。どれか1つが失敗しても他の結果を使いたい場合は Promise.allSettled() を選びましょう。
いつ使う?
- API通信(
fetchは Promise を返す) - ファイルの読み書き(Node.js の fs モジュール)
- 複数の非同期処理を並列実行するとき(
Promise.all) - 自分で非同期処理を定義するとき(
new Promise(...))
間違いやすいポイント
❌ .catch() を書き忘れてエラーが握りつぶされる
Promise のエラーは .catch() か try-catch で必ず処理しましょう。書き忘れると「Unhandled Promise Rejection」の警告が出てバグの原因になります。
❌ .then() の戻り値を return し忘れる
.then() の中で別の Promise を返す場合、return を忘れると次の .then() が undefined を受け取ります。チェーンを繋ぐときは必ず return しましょう。
よくある疑問
Q: async/awaitとthen/catchの違いは?
A: 同じPromiseを扱いますが、async/awaitの方が同期的な見た目で読みやすいコードになります。どちらを使ってもOKです。
Q: Promiseの3つの状態とは?
A: pending(処理中)、fulfilled(成功)、rejected(失敗)の3つです。一度fulfilledかrejectedになると変わりません。
Q: Promise.allとは?
A: 複数のPromiseを並列実行し、全て完了するのを待ちます。1つでも失敗すると全体が失敗になります。全結果が欲しいならPromise.allSettledを使います。
関連用語
- async/await — Promiseをより読みやすく書くための構文
- コールバック — Promiseが登場する前の非同期処理の書き方
- API — fetchなどAPIアクセスではPromiseが必ず登場する
- try-catch — async/await と組み合わせてPromiseのエラーを処理する
📖 関連レッスン
レッスンを見る →