プロミスとはITで何ですか?

プロミスとはITで何ですか?:非同期処理を分かりやすく管理

「プロミスとはITで何ですか?」という疑問に答えます。Promise(プロミス)は、JavaScriptをはじめとする多くのプログラミング言語で使用される、非同期処理を扱うための重要な概念です。特にWeb開発において、サーバーとの通信やファイルの読み込みなど、時間のかかる処理を効率的に管理するために欠かせません。

プロミスの役割:未来の値を約束する

ITにおけるプロミスとは、未来のある時点で値が確定する処理を表現したオブジェクトです。非同期処理の結果は、処理が開始された時点では分からなくても問題ありません。プロミスは、その結果を後から確実に取得できる仕組みを提供します。例えば、Web APIへのリクエストやファイルの読み込みなど、時間のかかる処理を行う際に、その完了を待つことができます。

プロミスを使用すると、非同期処理が完了するまで他のコードがブロックされることなく並行して実行され、処理が終わると結果やエラーを受け取ることができます。

プロミスの状態:処理の進捗を把握する

プロミスは、以下の3つの状態を持ちます。それぞれの状態に応じて適切な処理を実行することができます。

  1. pending(待機中)
    プロミスが作成された直後の状態で、非同期処理はまだ完了していません。この状態のまま、後続の処理が実行されるのを待ちます。

  2. fulfilled(履行済み)
    非同期処理が成功裏に完了した状態です。resolve()関数に渡された値が、処理の結果として返されます。

  3. rejected(拒否済み)
    非同期処理が失敗した状態です。reject()関数に渡された理由(通常はエラーオブジェクト)が、処理の失敗原因として返されます。

これらの状態を追跡することで、非同期処理の進捗や結果に応じて適切なアクションを取ることができます。

プロミスの使い方:then、catch、finallyで結果を処理

プロミスの状態変化に応じて処理を実行するために、以下のメソッドを使用します。

then(onFulfilled, onRejected)

then()メソッドは、プロミスが履行(fulfilled)または拒否(rejected)された場合にそれぞれのコールバック関数を実行します。

  • onFulfilled: プロミスが成功した場合に実行されます。
  • onRejected: プロミスが失敗した場合に実行されます。
javascript
const promise = new Promise((resolve, reject) => {
  resolve("成功");
});

promise.then(
  (result) => {
    console.log(result); // "成功"
  },
  (error) => {
    console.error(error);
  }
);​

catch(onRejected)

catch()メソッドは、プロミスが拒否された場合に実行されます。then(undefined, onRejected)の簡略記法です。

javascript
const promise = new Promise((resolve, reject) => {
  reject("エラー発生");
});

promise.catch((error) => {
  console.error(error); // "エラー発生"
});​

finally(onFinally)

finally()メソッドは、プロミスが履行または拒否されたかに関わらず、必ず実行されるコールバック関数を指定します。例えば、クリーンアップ処理を行うのに便利です。

javascript
const promise = new Promise((resolve, reject) => {
  resolve("完了");
});

promise.finally(() => {
  console.log("後処理が実行されました");
});​

プロミスの連鎖:非同期処理を繋げる

then()メソッドは新しいプロミスを返すため、複数の非同期処理を繋げることができます。これにより、順次実行される非同期処理を連鎖的に記述することができ、コードが整理されます。

javascript
const promise1 = new Promise((resolve) => resolve(1));

promise1
  .then((value) => {
    console.log(value); // 1
    return value + 1;
  })
  .then((value) => {
    console.log(value); // 2
    return value + 1;
  })
  .then((value) => {
    console.log(value); // 3
  });​

プロミスの並行処理:複数のプロミスを同時に扱う

複数のプロミスを同時に扱うために、Promise.all()Promise.race()Promise.allSettled() などのメソッドを使用します。

Promise.all()

Promise.all()は、複数のプロミスを並列に実行し、すべてのプロミスが成功した時にその結果を取得します。いずれかのプロミスが失敗した場合、即座にエラーが返されます。

javascript
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3])
  .then((results) => {
    console.log(results); // [1, 2, 3]
  })
  .catch((error) => {
    console.error(error);
  });​

Promise.race()

Promise.race()は、最初に解決または拒否されたプロミスの結果を返します。他のプロミスは待たずに処理されます。

javascript
const promise1 = new Promise((resolve) => setTimeout(resolve, 500, "1秒"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, "0.1秒"));

Promise.race([promise1, promise2])
  .then((result) => {
    console.log(result); // "0.1秒"
  });​

Promise.allSettled()

Promise.allSettled()は、すべてのプロミスが完了(成功または失敗)した後、結果を取得できます。

javascript
const promise1 = Promise.resolve(1);
const promise2 = Promise.reject("エラー");

Promise.allSettled([promise1, promise2])
  .then((results) => {
    console.log(results); 
    // [
    //   { status: "fulfilled", value: 1 },
    //   { status: "rejected", reason: "エラー" }
    // ]
  });​

プロミスの活用例:Web APIとの連携

Web APIを呼び出す際に、fetch APIはPromiseを返します。then()メソッドを使ってレスポンスデータを取得し、catch()メソッドでエラー処理を行います。

javascript
fetch("https://api.example.com/data")
  .then((response) => response.json())
  .then((data) => {
    console.log(data); // APIからのデータ
  })
  .catch((error) => {
    console.error("APIリクエストの失敗:", error);
  });​

まとめ:プロミスで非同期処理をスマートに

プロミスは、非同期処理を分かりやすく管理するための強力なツールです。状態、thencatchfinallyメソッド、そして連鎖や並行処理といった概念を理解することで、JavaScriptだけでなく、他の言語でも非同期処理を効果的に扱えるようになります。非同期処理をスマートに管理するために、プロミスを活用しましょう。

参考文献

プロミスに関する詳細な情報は、以下のリンクから確認できます。

よくある質問 (QA)

Q1: プロミスはどのように活用されますか?
A1: プロミスは、チームが共通の目標を持つために活用され、プロジェクトの進行をスムーズにする役割があります。

Q2: プロミスが守られない場合はどうなりますか?
A2: プロミスが守られない場合、信頼関係が損なわれ、プロジェクト全体に悪影響を与える可能性があります。

Q3: プロミスを確認する方法はありますか?
A3: プロミスの進行状況を定期的にレビューし、チーム内でフィードバックを行うことで確認できます。

その他の参考記事:promise 使い方