1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Promise、async/await

Posted at

Promiseの基本

非同期処理を行うためのPromise、async/awaitについて解説していきます。

Promiseは「pending」、「fulfilled」、「rejected」の状態を持ちます。

  • pending: 非同期処理がまだ完了していない状態
  • fulfilled: 非同期処理が成功し、結果が利用可能な状態
  • rejected: 非同期処理が失敗し、エラーが発生した状態

Promiseが生成されると、まずはpending状態になります。
その後、非同期処理が成功すればfulfilledに、失敗すればrejectedの状態が変わります。

Promiseの作成と利用

Promiseは以下のように作成します。

const promise = new Promise((resolve, reject) => {
  // 非同期処理
});

この非同期処理が成功すればresolve関数を、失敗すればreject関数を呼び出します。
それぞれの関数には、非同期処理の結果またはエラー情報を引数として渡すことができます。

Promiseの結果はthenメソッドを使って取得します。
このメソッドは、Promiseがfulfilled状態になったときに実行されるコールバック関数を登録するためのものです。

promise.then((result) => {
  // 非同期処理の結果を利用する
});

また、Promiseがrejected状態になったときにはcatchメソッドを使ってエラーを処理します。

promise.catch((error) => {
  // エラーの処理
});

繋げて利用することも可能です

promise
  .then((result) => {
      // 非同期処理の結果を利用する
  })
  .catch((error) => {
      // エラーの処理
  });

async/awaitの基本

async/awaitは、JavaScriptにおける非同期処理をより簡潔に書くための機能です。
asyncとawaitはキーワードで、一緒に使われることが多いです。

asyncは関数に付けられ、その関数が必ずPromiseを返すことを示します。
そのPromiseの結果は、関数の戻り値として得ることができます。

async function fetchData() {
  return "data";
}

const promise = fetchData();

上記の例では、fetchData関数はPromiseを返します。
このPromiseはすぐにfulfilled状態になり、その結果は文字列"data"です。

awaitの利用

awaitは、Promiseの結果を待つために使われます。
awaitはasync関数の中でのみ使用できます。

async function fetchData() {
  const response = await fetch("https://example.com/data");
  const data = await response.json();
  return data;
}

上記の例では、fetch関数はサーバーからデータを取得するPromiseを返します。
awaitはこのPromiseがfulfilledになるのを待ち、その結果をresponse変数に代入します。

その後、response.jsonメソッドはレスポンスのボディを解析するPromiseを返します。
再びawaitがこのPromiseがfulfilledになるのを待ち、その結果をdata変数に代入します。

最終的に、fetchData関数は解析されたデータを含むPromiseを返します。

Promise.allを使った例

Promise.allとasync/awaitを使えば、更に簡潔に書くことができます。

async function fetchAllData() {
  const response1 = fetch("https://example.com/data1");
  const response2 = fetch("https://example.com/data2");
  const response3 = fetch("https://example.com/data3");

  const responses = await Promise.all([response1, response2, response3]);

  const data1 = await responses[0].json();
  const data2 = await responses[1].json();
  const data3 = await responses[2].json();

  return [data1, data2, data3];
}

分かりやすいように書いていますが短縮すると下記になります

async function fetchAllData() {
  const urls = ["https://example.com/data1", "https://example.com/data2", "https://example.com/data3"];
  const responses = await Promise.all(urls.map(url => fetch(url)));
  return await Promise.all(responses.map(response => response.json()));
}

async/awaitによるエラーハンドリング

async function fetchData() {
  try {
    const response = await fetch("https://example.com/data");
    return await response.json();
  } catch (error) {
    // エラーの処理
    console.error("Error:", error);
  }
}

上記の例では、fetch関数やresponse.jsonメソッドがエラーをスローすると、そのエラーはcatchブロックで捕捉されます。
エラーの詳細はerror変数に代入され、それを使ってエラーの処理を行います。

まとめ

JavaScriptのPromiseとasync/awaitは、非同期処理を扱うための強力なツールです。Promiseは非同期処理の結果を表現するオブジェクトで、async/awaitはその非同期処理をより直感的に書くための機能です。
これらの機能をうまく使いこなすことで、非同期処理を含む複雑なプログラムも簡潔にかつ効率的に書くことができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?