<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Promise</id>
	<title>JavaScriptの基礎 - Promise - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Promise"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Promise&amp;action=history"/>
	<updated>2026-04-25T22:13:59Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Promise&amp;diff=14372&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == Promiseは、非同期処理の最終的な完了または失敗を表すオブジェクトである。&lt;br&gt; ES2015 (ES6) で導入され、コールバック関数によって引き起こされるコールバック地獄を解決するための仕組みとして設計された。&lt;br&gt; &lt;br&gt; Promiseを使用すると、非同期処理の成功・失敗を統一されたインターフェースで扱うことができる。&lt;br&gt; 処理の結果を &lt;code&gt;.the…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Promise&amp;diff=14372&amp;oldid=prev"/>
		<updated>2026-02-20T13:47:19Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == Promiseは、非同期処理の最終的な完了または失敗を表すオブジェクトである。&amp;lt;br&amp;gt; ES2015 (ES6) で導入され、コールバック関数によって引き起こされるコールバック地獄を解決するための仕組みとして設計された。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; Promiseを使用すると、非同期処理の成功・失敗を統一されたインターフェースで扱うことができる。&amp;lt;br&amp;gt; 処理の結果を &amp;lt;code&amp;gt;.the…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
Promiseは、非同期処理の最終的な完了または失敗を表すオブジェクトである。&amp;lt;br&amp;gt;&lt;br /&gt;
ES2015 (ES6) で導入され、コールバック関数によって引き起こされるコールバック地獄を解決するための仕組みとして設計された。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Promiseを使用すると、非同期処理の成功・失敗を統一されたインターフェースで扱うことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
処理の結果を &amp;lt;code&amp;gt;.then&amp;lt;/code&amp;gt; チェーンで連結することにより、非同期処理を同期処理と同様の可読性で記述できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Promiseの主な特徴は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
* 状態管理&lt;br /&gt;
*: pending (待機)、fulfilled (履行)、rejected (拒否) の3状態を持つ&lt;br /&gt;
*: 一度settled (確定) した状態は変更されない&lt;br /&gt;
* チェーン接続&lt;br /&gt;
*: &amp;lt;code&amp;gt;.then&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;.catch&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;.finally&amp;lt;/code&amp;gt; メソッドで処理を連結できる&lt;br /&gt;
*: 各メソッドは新しいPromiseを返すため、チェーンが構築できる&lt;br /&gt;
* 静的メソッド&lt;br /&gt;
*: &amp;lt;code&amp;gt;Promise.all&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Promise.race&amp;lt;/code&amp;gt; 等、複数のPromiseを組み合わせるメソッドを持つ&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
なお、Promiseをより簡潔に記述する &amp;lt;code&amp;gt;async&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;await&amp;lt;/code&amp;gt; 構文については、[[JavaScriptの基礎 - async await]]のページを参照すること。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Promiseとは ==&lt;br /&gt;
==== Promiseの状態 ====&lt;br /&gt;
Promiseは作成された時点から、以下の3つのいずれかの状態を持つ。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Promiseの3つの状態&lt;br /&gt;
! 状態 !! 意味 !! 値の有無&lt;br /&gt;
|-&lt;br /&gt;
| pending (待機) || 初期状態&amp;lt;br&amp;gt;処理が完了していない状態 || 値なし&lt;br /&gt;
|-&lt;br /&gt;
| fulfilled (履行) || 処理が成功して完了した状態 || value (結果値) を持つ&lt;br /&gt;
|-&lt;br /&gt;
| rejected (拒否) || 処理が失敗した状態 || reason (拒否理由) を持つ&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
pendingからfulfilled または rejected へ遷移すると、その後状態は変化しない。&amp;lt;br&amp;gt;&lt;br /&gt;
fulfilled および rejected の状態をまとめて &amp;lt;u&amp;gt;settled (確定)&amp;lt;/u&amp;gt; と呼ぶ。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
状態遷移は一方向であり、1度settledになったPromiseの状態を後から変更することはできない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== new Promise ====&lt;br /&gt;
&amp;lt;code&amp;gt;new Promise(executor)&amp;lt;/code&amp;gt; でPromiseオブジェクトを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
executorは、Promise生成時に同期的に呼び出される関数であり、&amp;lt;code&amp;gt;resolve&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;reject&amp;lt;/code&amp;gt; の2つの引数を受け取る。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
基本構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const promise = new Promise((resolve, reject) =&amp;gt; {&lt;br /&gt;
    // 非同期処理または同期処理を記述する&lt;br /&gt;
    if (/* 処理が成功 */ true) {&lt;br /&gt;
       resolve(value);   // fulfilled状態に変更する&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
       reject(reason);   // rejected状態に変更する&lt;br /&gt;
    }&lt;br /&gt;
 });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
executor内での各関数の動作を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Promiseコンストラクタのコールバック引数&lt;br /&gt;
! 引数 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;resolve(value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Promiseをfulfilled状態に変更し、valueを結果として保持する。&lt;br /&gt;
* valueが別のPromiseの場合、そのPromiseが解決されるまで待機する。&lt;br /&gt;
* valueが通常の値の場合、そのまま結果値となる。&lt;br /&gt;
* &amp;lt;code&amp;gt;resolve&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;reject&amp;lt;/code&amp;gt; は最初の呼び出しのみが有効であり、&amp;lt;br&amp;gt;複数回呼び出しても2回目以降は無視される。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reject(reason)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Promiseをrejected状態に変更し、reasonを拒否理由として保持する。&lt;br /&gt;
* reasonは、一般的にErrorオブジェクトを渡すが、任意の値を指定できる。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;executor内で例外が発生した場合、&amp;lt;code&amp;gt;resolve&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;reject&amp;lt;/code&amp;gt; がまだ呼ばれていなければ、Promiseは自動的にrejected状態となる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
実用的な使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // n秒後に値を返すPromiseを作成する&lt;br /&gt;
 function delay(ms) {&lt;br /&gt;
    return new Promise((resolve) =&amp;gt; {&lt;br /&gt;
       setTimeout(() =&amp;gt; resolve(ms), ms);&lt;br /&gt;
    });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 成功と失敗の両方を持つPromiseの例&lt;br /&gt;
 function fetchData(shouldFail) {&lt;br /&gt;
    return new Promise((resolve, reject) =&amp;gt; {&lt;br /&gt;
       if (shouldFail) {&lt;br /&gt;
          reject(new Error(&amp;quot;データの取得に失敗した&amp;quot;));&lt;br /&gt;
       }&lt;br /&gt;
       else {&lt;br /&gt;
          resolve({ id: 1, name: &amp;quot;Alice&amp;quot; });&lt;br /&gt;
       }&lt;br /&gt;
    });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 使用例&lt;br /&gt;
 delay(1000).then(ms =&amp;gt; console.log(ms + &amp;quot;ミリ秒が経過した&amp;quot;));&lt;br /&gt;
 // 1秒後: &amp;quot;1000ミリ秒が経過した&amp;quot;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== thenチェーン ==&lt;br /&gt;
==== .then ====&lt;br /&gt;
&amp;lt;code&amp;gt;.then(onFulfilled, onRejected)&amp;lt;/code&amp;gt; は、Promiseがsettledになった後に実行するコールバックを登録するメソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
常に新しいPromiseを返すため、複数の &amp;lt;code&amp;gt;.then&amp;lt;/code&amp;gt; を連結してチェーンを構築できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ thenメソッドのコールバック引数&lt;br /&gt;
! 引数 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;onFulfilled&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Promiseがfulfilled状態になった時に実行される。&lt;br /&gt;
* 引数にPromiseの結果値 (value) を受け取る。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;onRejected&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Promiseがrejected状態になった時に実行される。&lt;br /&gt;
* 引数に拒否理由 (reason) を受け取る。&lt;br /&gt;
* &amp;lt;u&amp;gt;省略した場合は、rejectedをそのまま次のPromiseに伝播する。&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.then&amp;lt;/code&amp;gt; の戻り値のルールを以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ thenメソッドの戻り値の挙動&lt;br /&gt;
! 条件 !! 挙動&lt;br /&gt;
|-&lt;br /&gt;
| コールバックが値を返した場合 || その値でfulfilledになる新しいPromiseを返す。&lt;br /&gt;
|-&lt;br /&gt;
| コールバックがPromiseを返した場合 || その返されたPromiseが解決されるまで待機する。&lt;br /&gt;
|-&lt;br /&gt;
| コールバックで例外が発生した場合 || その例外でrejectedになる新しいPromiseを返す。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // .thenチェーンで値を変換しながら伝播する&lt;br /&gt;
 Promise.resolve(1)&lt;br /&gt;
    .then(value =&amp;gt; {&lt;br /&gt;
       console.log(value);  // 1&lt;br /&gt;
       return value + 1;    // 次のthenにvalue=2が渡される&lt;br /&gt;
    })&lt;br /&gt;
    .then(value =&amp;gt; {&lt;br /&gt;
       console.log(value);  // 2&lt;br /&gt;
       return value * 10;   // 次のthenにvalue=20が渡される&lt;br /&gt;
    })&lt;br /&gt;
    .then(value =&amp;gt; {&lt;br /&gt;
       console.log(value);  // 20&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
 // Promiseを返すことで非同期処理を直列につなぐ&lt;br /&gt;
 function fetchUser(id) {&lt;br /&gt;
    return Promise.resolve({ id, name: &amp;quot;Alice&amp;quot; });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function fetchPosts(userId) {&lt;br /&gt;
    return Promise.resolve([{ id: 1, title: &amp;quot;最初の投稿&amp;quot;, userId }]);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fetchUser(1)&lt;br /&gt;
    .then(user =&amp;gt; {&lt;br /&gt;
       console.log(&amp;quot;ユーザ:&amp;quot;, user.name);&lt;br /&gt;
       return fetchPosts(user.id);  // Promiseを返す&lt;br /&gt;
    })&lt;br /&gt;
    .then(posts =&amp;gt; {&lt;br /&gt;
       console.log(&amp;quot;投稿数:&amp;quot;, posts.length);&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== .catch ====&lt;br /&gt;
&amp;lt;code&amp;gt;.catch(onRejected)&amp;lt;/code&amp;gt; は、Promiseがrejected状態になった時のコールバックを登録するメソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.then(null, onRejected)&amp;lt;/code&amp;gt; と同等であり、チェーン内の任意の位置で発生したエラーをキャッチできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;onRejected&amp;lt;/code&amp;gt; 内で値を返した場合、その値でfulfilledになる新しいPromiseを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、エラーから回復してチェーンを継続することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // エラー回復の例&lt;br /&gt;
 Promise.reject(new Error(&amp;quot;最初のエラー&amp;quot;))&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       console.log(&amp;quot;エラーをキャッチ:&amp;quot;, error.message);&lt;br /&gt;
       return &amp;quot;回復した値&amp;quot;;  // エラーから回復してチェーンを継続する&lt;br /&gt;
    })&lt;br /&gt;
    .then(value =&amp;gt; {&lt;br /&gt;
       console.log(&amp;quot;回復後の値:&amp;quot;, value);  // &amp;quot;回復した値&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
 // チェーン内のエラーをまとめてキャッチする&lt;br /&gt;
 fetchUser(1)&lt;br /&gt;
    .then(user =&amp;gt; fetchPosts(user.id))&lt;br /&gt;
    .then(posts =&amp;gt; fetchComments(posts[0].id))&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       // どのステップで発生したエラーもここでキャッチできる&lt;br /&gt;
       console.error(&amp;quot;処理に失敗した:&amp;quot;, error.message);&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== .finally ====&lt;br /&gt;
&amp;lt;code&amp;gt;.finally(onFinally)&amp;lt;/code&amp;gt; は、Promiseがfulfilled または rejected のいずれの状態になった場合も実行されるコールバックを登録するメソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;.finally&amp;lt;/code&amp;gt; の特徴を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;onFinally&amp;lt;/code&amp;gt; は引数を受け取らない。(成功・失敗の結果は渡されない)&lt;br /&gt;
* 元のPromiseの状態と結果値がそのまま保持される。(通過する)&lt;br /&gt;
* リソースの解放やローディング状態の解除等、クリーンアップ処理に使用する。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // ローディング表示のクリーンアップ例&lt;br /&gt;
 function fetchWithLoading(url) {&lt;br /&gt;
    showLoadingSpinner();  // ローディング表示開始&lt;br /&gt;
 &lt;br /&gt;
    return fetch(url)&lt;br /&gt;
       .then(response =&amp;gt; response.json())&lt;br /&gt;
       .catch(error =&amp;gt; {&lt;br /&gt;
          console.error(&amp;quot;取得に失敗した:&amp;quot;, error.message);&lt;br /&gt;
          throw error;  // エラーを再スローして呼び出し元に伝える&lt;br /&gt;
       })&lt;br /&gt;
       .finally(() =&amp;gt; {&lt;br /&gt;
          hideLoadingSpinner();  // 成功・失敗に関わらずローディングを非表示にする&lt;br /&gt;
       });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // .finallyの戻り値は元のPromiseの結果を引き継ぐ&lt;br /&gt;
 Promise.resolve(&amp;quot;成功値&amp;quot;)&lt;br /&gt;
    .finally(() =&amp;gt; {&lt;br /&gt;
       console.log(&amp;quot;finallyが実行された&amp;quot;);&lt;br /&gt;
       // return &amp;quot;別の値&amp;quot;;  // この戻り値は無視される&lt;br /&gt;
    })&lt;br /&gt;
    .then(value =&amp;gt; {&lt;br /&gt;
       console.log(value);  // &amp;quot;成功値&amp;quot; (元の値が保持される)&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== チェーンの動作原理 ====&lt;br /&gt;
&amp;lt;code&amp;gt;.then&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;.catch&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;.finally&amp;lt;/code&amp;gt; は常に新しいPromiseを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
この性質により、各メソッドをチェーン状に連結することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
コールバックの戻り値が次のPromiseの状態を決定する仕組みを以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // チェーンの動作原理を示す例&lt;br /&gt;
 const p1 = Promise.resolve(&amp;quot;初期値&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 const p2 = p1.then(value =&amp;gt; {&lt;br /&gt;
    // 通常の値を返す → p2はその値でfulfilledになる&lt;br /&gt;
    return value + &amp;quot; -&amp;gt; 変換後&amp;quot;;&lt;br /&gt;
 });&lt;br /&gt;
 &lt;br /&gt;
 const p3 = p2.then(value =&amp;gt; {&lt;br /&gt;
    // Promiseを返す → p3はそのPromiseの解決を待つ&lt;br /&gt;
    return new Promise(resolve =&amp;gt; {&lt;br /&gt;
       setTimeout(() =&amp;gt; resolve(value + &amp;quot; -&amp;gt; 非同期処理後&amp;quot;), 100);&lt;br /&gt;
    });&lt;br /&gt;
 });&lt;br /&gt;
 &lt;br /&gt;
 const p4 = p3.then(value =&amp;gt; {&lt;br /&gt;
    // 例外を投げる → p4はrejectedになる&lt;br /&gt;
    throw new Error(&amp;quot;意図的なエラー&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
 &lt;br /&gt;
 const p5 = p4.catch(error =&amp;gt; {&lt;br /&gt;
    // .catchのコールバックが値を返す → p5はfulfilledになる (エラー回復)&lt;br /&gt;
    return &amp;quot;エラーから回復&amp;quot;;&lt;br /&gt;
 });&lt;br /&gt;
 &lt;br /&gt;
 p5.then(value =&amp;gt; console.log(value));  // &amp;quot;エラーから回復&amp;quot;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;エラーはチェーン内を伝播し、最初の &amp;lt;code&amp;gt;.catch&amp;lt;/code&amp;gt; に到達するまで各 &amp;lt;code&amp;gt;.then&amp;lt;/code&amp;gt; をスキップする。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // エラー伝播の例&lt;br /&gt;
 Promise.resolve(&amp;quot;開始&amp;quot;)&lt;br /&gt;
    .then(value =&amp;gt; { throw new Error(&amp;quot;ステップ1でエラー&amp;quot;); })&lt;br /&gt;
    .then(value =&amp;gt; {&lt;br /&gt;
       // このコールバックはスキップされる (エラーが伝播している)&lt;br /&gt;
       console.log(&amp;quot;スキップ:&amp;quot;, value);&lt;br /&gt;
       return value;&lt;br /&gt;
    })&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       // エラーがここでキャッチされる&lt;br /&gt;
       console.log(&amp;quot;キャッチ:&amp;quot;, error.message);  // &amp;quot;ステップ1でエラー&amp;quot;&lt;br /&gt;
       return &amp;quot;回復した&amp;quot;;&lt;br /&gt;
    })&lt;br /&gt;
    .then(value =&amp;gt; {&lt;br /&gt;
       // .catchの後は通常のチェーンに戻る&lt;br /&gt;
       console.log(&amp;quot;回復後:&amp;quot;, value);  // &amp;quot;回復した&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Promiseの静的メソッド ==&lt;br /&gt;
==== Promise.resolve / Promise.reject ====&lt;br /&gt;
&amp;lt;code&amp;gt;Promise.resolve(value)&amp;lt;/code&amp;gt; は、指定した値でfulfilledになるPromiseを生成するショートカットである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Promise.reject(reason)&amp;lt;/code&amp;gt; は、指定した理由でrejectedになるPromiseを生成するショートカットである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // Promise.resolve : 値をPromiseに変換する&lt;br /&gt;
 Promise.resolve(42).then(v =&amp;gt; console.log(v));       // 42&lt;br /&gt;
 Promise.resolve(&amp;quot;hello&amp;quot;).then(v =&amp;gt; console.log(v));  // &amp;quot;hello&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // valueがPromiseの場合はそのまま返す (新しいPromiseでラップしない)&lt;br /&gt;
 const p = Promise.resolve(42);&lt;br /&gt;
 console.log(Promise.resolve(p) === p);               // true&lt;br /&gt;
 &lt;br /&gt;
 // Promise.reject : 拒否されたPromiseを生成する&lt;br /&gt;
 Promise.reject(new Error(&amp;quot;失敗&amp;quot;)).catch(e =&amp;gt; console.log(e.message));  // &amp;quot;失敗&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // 関数をPromiseを返す形式に正規化する際に使用する&lt;br /&gt;
 function ensurePromise(value) {&lt;br /&gt;
    return Promise.resolve(value);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ensurePromise(42).then(v =&amp;gt; console.log(v));                   // 42&lt;br /&gt;
 ensurePromise(Promise.resolve(42)).then(v =&amp;gt; console.log(v));  // 42&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Promise.all ====&lt;br /&gt;
&amp;lt;code&amp;gt;Promise.all(iterable)&amp;lt;/code&amp;gt; は、渡したPromiseの配列が全てfulfilledになるまで待機し、全ての結果を配列で返す。&amp;lt;br&amp;gt;&lt;br /&gt;
1つでもrejectedになると、即座にrejectedになる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // 全てのPromiseが成功する場合&lt;br /&gt;
 const p1 = Promise.resolve(&amp;quot;ユーザ情報&amp;quot;);&lt;br /&gt;
 const p2 = Promise.resolve(&amp;quot;注文情報&amp;quot;);&lt;br /&gt;
 const p3 = Promise.resolve(&amp;quot;在庫情報&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 Promise.all([p1, p2, p3])&lt;br /&gt;
    .then(([user, order, stock]) =&amp;gt; {&lt;br /&gt;
       // 結果は元の配列の順序を維持する&lt;br /&gt;
       console.log(user);   // &amp;quot;ユーザ情報&amp;quot;&lt;br /&gt;
       console.log(order);  // &amp;quot;注文情報&amp;quot;&lt;br /&gt;
       console.log(stock);  // &amp;quot;在庫情報&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
 // 1つでも失敗すると即座にrejectされる&lt;br /&gt;
 Promise.all([&lt;br /&gt;
    Promise.resolve(&amp;quot;成功1&amp;quot;),&lt;br /&gt;
    Promise.reject(new Error(&amp;quot;失敗&amp;quot;)),&lt;br /&gt;
    Promise.resolve(&amp;quot;成功2&amp;quot;),&lt;br /&gt;
 ])&lt;br /&gt;
 .catch(error =&amp;gt; {&lt;br /&gt;
    console.log(error.message);  // &amp;quot;失敗&amp;quot;&lt;br /&gt;
    // &amp;quot;成功1&amp;quot;や&amp;quot;成功2&amp;quot;の結果は取得できない&lt;br /&gt;
 });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Promise.allSettled ====&lt;br /&gt;
&amp;lt;code&amp;gt;Promise.allSettled(iterable)&amp;lt;/code&amp;gt; は、渡したPromiseの配列が全てsettledになるまで待機する。&amp;lt;br&amp;gt;&lt;br /&gt;
成功・失敗に関わらず全ての結果を収集して、各結果を &amp;lt;code&amp;gt;{ status, value }&amp;lt;/code&amp;gt; または &amp;lt;code&amp;gt;{ status, reason }&amp;lt;/code&amp;gt; 形式のオブジェクトの配列で返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 Promise.allSettled([&lt;br /&gt;
    Promise.resolve(&amp;quot;成功&amp;quot;),&lt;br /&gt;
    Promise.reject(new Error(&amp;quot;失敗&amp;quot;)),&lt;br /&gt;
    Promise.resolve(&amp;quot;また成功&amp;quot;),&lt;br /&gt;
 ])&lt;br /&gt;
 .then(results =&amp;gt; {&lt;br /&gt;
    results.forEach(result =&amp;gt; {&lt;br /&gt;
       if (result.status === &amp;quot;fulfilled&amp;quot;) {&lt;br /&gt;
          console.log(&amp;quot;成功:&amp;quot;, result.value);&lt;br /&gt;
       }&lt;br /&gt;
       else {&lt;br /&gt;
          console.log(&amp;quot;失敗:&amp;quot;, result.reason.message);&lt;br /&gt;
       }&lt;br /&gt;
    });&lt;br /&gt;
 });&lt;br /&gt;
 // 出力:&lt;br /&gt;
 // &amp;quot;成功: 成功&amp;quot;&lt;br /&gt;
 // &amp;quot;失敗: 失敗&amp;quot;&lt;br /&gt;
 // &amp;quot;成功: また成功&amp;quot;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;Promise.all&amp;lt;/code&amp;gt; と異なり、途中で失敗しても全ての結果を取得できる点がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Promise.race ====&lt;br /&gt;
&amp;lt;code&amp;gt;Promise.race(iterable)&amp;lt;/code&amp;gt; は、渡したPromiseのうち最初に settled になったものの結果 (fulfilled または rejectedどちらでも) を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // タイムアウト処理の実装例&lt;br /&gt;
 function fetchWithTimeout(url, timeoutMs) {&lt;br /&gt;
    const fetchPromise = fetch(url);&lt;br /&gt;
    const timeoutPromise = new Promise((_, reject) =&amp;gt; {&lt;br /&gt;
       setTimeout(() =&amp;gt; reject(new Error(&amp;quot;タイムアウト&amp;quot;)), timeoutMs);&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
    return Promise.race([fetchPromise, timeoutPromise]);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fetchWithTimeout(&amp;quot;https://api.example.com/data&amp;quot;, 3000)&lt;br /&gt;
    .then(response =&amp;gt; response.json())&lt;br /&gt;
    .then(data =&amp;gt; console.log(data))&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       if (error.message === &amp;quot;タイムアウト&amp;quot;) {&lt;br /&gt;
          console.log(&amp;quot;3秒以内に応答がなかった&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
       else {&lt;br /&gt;
          console.log(&amp;quot;取得に失敗した:&amp;quot;, error.message);&lt;br /&gt;
       }&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Promise.any ====&lt;br /&gt;
&amp;lt;code&amp;gt;Promise.any(iterable)&amp;lt;/code&amp;gt; は、渡したPromiseのうち最初にfulfilledになったものの値を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
全てのPromiseがrejectedになった場合のみ、&amp;lt;code&amp;gt;AggregateError&amp;lt;/code&amp;gt; でrejectedになる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // フェイルオーバー (CDN冗長化) の実装例&lt;br /&gt;
 function fetchFromFastest(urls) {&lt;br /&gt;
    const requests = urls.map(url =&amp;gt; fetch(url));&lt;br /&gt;
    return Promise.any(requests);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fetchFromFastest([&lt;br /&gt;
    &amp;quot;https://cdn1.example.com/data&amp;quot;,&lt;br /&gt;
    &amp;quot;https://cdn2.example.com/data&amp;quot;,&lt;br /&gt;
    &amp;quot;https://cdn3.example.com/data&amp;quot;,&lt;br /&gt;
 ])&lt;br /&gt;
    .then(response =&amp;gt; console.log(&amp;quot;最速のCDNから取得成功&amp;quot;))&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       // AggregateErrorには全ての拒否理由が含まれる&lt;br /&gt;
       console.log(&amp;quot;全てのCDNから取得に失敗した&amp;quot;);&lt;br /&gt;
       console.log(error.errors);  // 各Promiseの拒否理由の配列&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Promise.try (ES2025) ====&lt;br /&gt;
&amp;lt;code&amp;gt;Promise.try(fn)&amp;lt;/code&amp;gt; は、関数 &amp;lt;code&amp;gt;fn&amp;lt;/code&amp;gt; を実行し、その結果を常にPromiseとして返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;fn&amp;lt;/code&amp;gt; が同期的に例外を投げた場合も、rejectedなPromiseとして扱われる点がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ブラウザサポートは Chrome 128+、Firefox 127+、Safari 17.6+、Node.js 22.6+ 以降である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // Promise.tryを使用しない場合: 同期例外がPromiseの拒否として扱われない&lt;br /&gt;
 // Promise.resolve().then(() =&amp;gt; riskySync()) のような回避策が必要だった&lt;br /&gt;
 &lt;br /&gt;
 // Promise.tryを使用した場合: 同期例外もPromiseの拒否として扱われる&lt;br /&gt;
 function riskySync() {&lt;br /&gt;
    throw new Error(&amp;quot;同期エラー&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Promise.try(() =&amp;gt; riskySync())&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       console.log(&amp;quot;捕捉:&amp;quot;, error.message);  // &amp;quot;捕捉: 同期エラー&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
 // 同期・非同期を問わず統一されたエラーハンドリングが実現できる&lt;br /&gt;
 function processInput(input) {&lt;br /&gt;
    return Promise.try(() =&amp;gt; {&lt;br /&gt;
       if (typeof input !== &amp;quot;string&amp;quot;) {&lt;br /&gt;
          throw new TypeError(&amp;quot;文字列を指定すること&amp;quot;);  // 同期例外&lt;br /&gt;
       }&lt;br /&gt;
       return fetch(&amp;quot;/api/process?q=&amp;quot; + input);  // 非同期処理&lt;br /&gt;
    });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 processInput(123)&lt;br /&gt;
    .catch(e =&amp;gt; console.log(e.message));  // &amp;quot;文字列を指定すること&amp;quot;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
下表に、各静的メソッドの動作の比較を示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Promiseの静的メソッド比較&lt;br /&gt;
! メソッド !! 完了タイミング !! 成功時の戻り値 !! 失敗時の動作 !! 主な用途&lt;br /&gt;
|-&lt;br /&gt;
| Promise.all || 全て完了まで待機 || 結果の配列 (順序維持) || 最初の拒否で即座にreject || 全て成功が必要な場合&lt;br /&gt;
|-&lt;br /&gt;
| Promise.allSettled || 全て完了まで待機 || status / value / reason オブジェクトの配列 || 全て収集 (rejectしない) || 全ての結果を取得したい場合&lt;br /&gt;
|-&lt;br /&gt;
| Promise.race || 最初に完了したもの || 最初の結果値 || 最初の拒否理由 || タイムアウト処理&lt;br /&gt;
|-&lt;br /&gt;
| Promise.any || 最初に成功したもの || 最初の成功値 || 全て失敗時のみ AggregateError || フェイルオーバー処理&lt;br /&gt;
|-&lt;br /&gt;
| Promise.try || 関数実行後 || 関数の戻り値または結果 || 同期/非同期例外を拒否として扱う || 統一されたエラーハンドリング&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== コールバック地獄からPromiseへの移行 ==&lt;br /&gt;
==== コールバックパターンのPromise化 ====&lt;br /&gt;
Node.jsスタイルのエラーファーストコールバック (第1引数がエラー、第2引数がデータ) を持つ関数は、Promiseを返す関数に変換 (Promisification) できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* コールバック地獄の例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // Before: コールバック地獄&lt;br /&gt;
 // ネストが深くなりコードの可読性が著しく低下する&lt;br /&gt;
 function getUserData(userId, callback) {&lt;br /&gt;
    fetchUser(userId, function(err, user) {&lt;br /&gt;
       if (err) {&lt;br /&gt;
          callback(err);&lt;br /&gt;
          return;&lt;br /&gt;
       }&lt;br /&gt;
       fetchPosts(user.id, function(err, posts) {&lt;br /&gt;
          if (err) {&lt;br /&gt;
             callback(err);&lt;br /&gt;
             return;&lt;br /&gt;
          }&lt;br /&gt;
          fetchComments(posts[0].id, function(err, comments) {&lt;br /&gt;
             if (err) {&lt;br /&gt;
                callback(err);&lt;br /&gt;
                return;&lt;br /&gt;
             }&lt;br /&gt;
             callback(null, { user, posts, comments });&lt;br /&gt;
          });&lt;br /&gt;
       });&lt;br /&gt;
    });&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* コールバックを持つ関数をPromise化する方法&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // コールバック関数をPromiseでラップする (Promisification)&lt;br /&gt;
 function fetchUser(userId) {&lt;br /&gt;
    return new Promise((resolve, reject) =&amp;gt; {&lt;br /&gt;
       fetchUserCallback(userId, (err, user) =&amp;gt; {&lt;br /&gt;
          if (err) reject(err);&lt;br /&gt;
          else resolve(user);&lt;br /&gt;
       });&lt;br /&gt;
    });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function fetchPosts(userId) {&lt;br /&gt;
    return new Promise((resolve, reject) =&amp;gt; {&lt;br /&gt;
       fetchPostsCallback(userId, (err, posts) =&amp;gt; {&lt;br /&gt;
          if (err) reject(err);&lt;br /&gt;
          else resolve(posts);&lt;br /&gt;
       });&lt;br /&gt;
    });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function fetchComments(postId) {&lt;br /&gt;
    return new Promise((resolve, reject) =&amp;gt; {&lt;br /&gt;
       fetchCommentsCallback(postId, (err, comments) =&amp;gt; {&lt;br /&gt;
          if (err) reject(err);&lt;br /&gt;
          else resolve(comments);&lt;br /&gt;
       });&lt;br /&gt;
    });&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Promise化した関数を使用してチェーンで記述すると、ソースコードが大幅に改善される。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // After: Promiseチェーン&lt;br /&gt;
 // 処理の流れが直線的になり可読性が向上する&lt;br /&gt;
 fetchUser(123)&lt;br /&gt;
    .then(user =&amp;gt; fetchPosts(user.id))&lt;br /&gt;
    .then(posts =&amp;gt; fetchComments(posts[0].id))&lt;br /&gt;
    .then(comments =&amp;gt; console.log(&amp;quot;コメント一覧:&amp;quot;, comments))&lt;br /&gt;
    .catch(error =&amp;gt; console.error(&amp;quot;処理に失敗した:&amp;quot;, error.message));&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Node.js環境では &amp;lt;code&amp;gt;util.promisify&amp;lt;/code&amp;gt; 関数を使用することにより、エラーファーストコールバックスタイルの関数を自動的にPromise化できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // Node.jsのutil.promisifyを使用した自動Promise化&lt;br /&gt;
 const { promisify } = require(&amp;quot;util&amp;quot;);&lt;br /&gt;
 const fs = require(&amp;quot;fs&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 // fs.readFileはコールバックスタイルの関数&lt;br /&gt;
 const readFileAsync = promisify(fs.readFile);&lt;br /&gt;
 &lt;br /&gt;
 readFileAsync(&amp;quot;./data.txt&amp;quot;, &amp;quot;utf8&amp;quot;)&lt;br /&gt;
    .then(content =&amp;gt; console.log(content))&lt;br /&gt;
    .catch(error =&amp;gt; console.error(&amp;quot;読み込みに失敗した:&amp;quot;, error.message));&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tauriでの使用例 ==&lt;br /&gt;
&amp;lt;u&amp;gt;Tauri v2の &amp;lt;code&amp;gt;invoke()&amp;lt;/code&amp;gt; 関数は、JavaScriptからRustのコマンドを呼び出す時、常にPromiseを返す。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;そのため、Tauriのフロントエンド開発においてPromiseは中心的な役割を担う。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* 基本&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import { invoke } from &amp;#039;@tauri-apps/api/core&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 // Rustコマンドを呼び出してPromiseチェーンで処理する&lt;br /&gt;
 invoke(&amp;#039;greet&amp;#039;, { name: &amp;#039;World&amp;#039; })&lt;br /&gt;
    .then(message =&amp;gt; {&lt;br /&gt;
       document.getElementById(&amp;#039;result&amp;#039;).textContent = message;&lt;br /&gt;
    })&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       console.error(&amp;#039;コマンドの実行に失敗した:&amp;#039;, error);&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
*: 対応するRust側のコマンド定義&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 #[tauri::command]&lt;br /&gt;
 async fn greet(name: &amp;amp;str) -&amp;gt; Result&amp;lt;String, String&amp;gt; {&lt;br /&gt;
    Ok(format!(&amp;quot;Hello, {}!&amp;quot;, name))&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 複数のコマンドをチェーンで連結する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import { invoke } from &amp;#039;@tauri-apps/api/core&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 // ファイルを読み込んで内容を処理するパイプライン&lt;br /&gt;
 invoke(&amp;#039;read_file&amp;#039;, { path: &amp;#039;/home/user/data.json&amp;#039; })&lt;br /&gt;
    .then(content =&amp;gt; {&lt;br /&gt;
       const data = JSON.parse(content);&lt;br /&gt;
       return invoke(&amp;#039;process_data&amp;#039;, { data });&lt;br /&gt;
    })&lt;br /&gt;
    .then(result =&amp;gt; {&lt;br /&gt;
       return invoke(&amp;#039;save_result&amp;#039;, { result, path: &amp;#039;/home/user/output.json&amp;#039; });&lt;br /&gt;
    })&lt;br /&gt;
    .then(() =&amp;gt; {&lt;br /&gt;
       console.log(&amp;#039;処理が完了した&amp;#039;);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       console.error(&amp;#039;エラーが発生した:&amp;#039;, error);&lt;br /&gt;
    })&lt;br /&gt;
    .finally(() =&amp;gt; {&lt;br /&gt;
       // ローディングスピナーを非表示にする等のクリーンアップ処理&lt;br /&gt;
       setLoading(false);&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 複数のRustコマンドを並列実行する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import { invoke } from &amp;#039;@tauri-apps/api/core&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 // Promise.allで複数のRustコマンドを並列実行する&lt;br /&gt;
 Promise.all([&lt;br /&gt;
    invoke(&amp;#039;get_system_info&amp;#039;),&lt;br /&gt;
    invoke(&amp;#039;get_app_config&amp;#039;),&lt;br /&gt;
    invoke(&amp;#039;get_user_preferences&amp;#039;),&lt;br /&gt;
 ])&lt;br /&gt;
    .then(([systemInfo, config, preferences]) =&amp;gt; {&lt;br /&gt;
       console.log(&amp;#039;システム情報:&amp;#039;, systemInfo);&lt;br /&gt;
       console.log(&amp;#039;アプリ設定:&amp;#039;, config);&lt;br /&gt;
       console.log(&amp;#039;ユーザ設定:&amp;#039;, preferences);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
       console.error(&amp;#039;情報の取得に失敗した:&amp;#039;, error);&lt;br /&gt;
    });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連情報 ==&lt;br /&gt;
* [[JavaScriptの基礎 - async await]]&lt;br /&gt;
*: Promiseをより簡潔に記述するためのasync / await構文の詳細&lt;br /&gt;
* [[JavaScriptの基礎 - イベントループ]]&lt;br /&gt;
*: JavaScriptの非同期処理を支えるイベントループの仕組み&lt;br /&gt;
* [[JavaScriptの基礎 - Fetch API]]&lt;br /&gt;
*: Promiseを返すFetch APIによるHTTPリクエストの実装&lt;br /&gt;
* [[JavaScriptの基礎 - コールバック関数]]&lt;br /&gt;
*: Promiseが解決した課題の背景となるコールバックパターンの詳細&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板&lt;br /&gt;
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:Web]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>