Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
Promise コンストラクターは、主にまだプロミスに対応していない関数をラップするために使用します。
コンストラクターが実行する関数 (function) です。これは、引数として resolveFunc と rejectFunc の 2 つの関数を受け取ります。executor で発生したエラーはすべてプロミスを拒否させ、返値は無視されます。executor の意味づけについては下記で詳しく説明します。
new で呼び出されると、Promise コンストラクターはプロミスオブジェクトを返します。このプロミスオブジェクトは、関数 resolveFunc または rejectFunc のいずれかが呼び出されると、「解決済み」になります。 resolveFunc を呼び出して別のプロミスオブジェクトを引数として渡すと、最初のプロミスは「解決済み」となりますが、まだ「確定済み」ではないことに注意してください。詳しくはプロミスの解説を参照してください。
従来(プロミス以前)、非同期タスクはコールバックとして設計されていました。
プロミスが提供するコードの読み取りやすさの向上と言語機能を活用するために、Promise() コンストラクターを使用すると、コールバックベースの API をプロミスベースの API に変換することができます。
メモ: タスクがすでにプロミスベースである場合、Promise() コンストラクターは不要でしょう。
executor は、コールバックの結果をプロミスに結びつけるカスタムコードです。プログラマーであるあなたが executor を書きます。そのシグネチャは次のようになります。
resolveFunc と rejectFunc も関数で、実際には好きな名前を付けることができます。呼び出し形式は単純で、単一の任意の型の引数を受け付けます。
resolveFunc に渡す value 引数は、別のプロミスオブジェクトにすることができます。その場合、新たに構築されたプロミスの状態は、渡されたプロミスに「ロックイン」されます(解決プロミスの一部として)。rejectFunc は、throw 文に近い意味を持ちます。そのため、reason は通常、Error インスタンスです。value または reason のいずれかを省略すると、プロミスは undefined で履行/拒否されます。
executor の完了状態は、プロミスの状態に制限された効果しか持ちません。
メモ: 待機中のプロミスの存在は、プログラムの終了を妨げることはありません。イベントループが空の場合、待機中のプロミスがあってもプログラムは終了します(必ず永遠に待機中であるため)。
以下に、典型的な流れの概要を示します。
例えば、上記のコールバックベースの readFile API は、プロミスベースの API に変換することができます。
resolve コールバックと reject コールバックは、実行関数のスコープ内でのみ利用できるため、プロミスが構築された後にそれらにアクセスすることはできません。プロミスの解決方法を決定する前にプロミスを構築したい場合は、代わりに Promise.withResolvers() メソッドを使用することができます。このメソッドは、resolve と reject の関数を公開します。
resolve 関数は、以下の動作をします。
最後の場合、これは次のようなコードを意味しています。
Is roughly equivalent to:
ただし、resolve(thenable) の場合は例外です。
resolve は、thenable.then() が value として渡した何かを再び呼び出すため、リゾルバー関数は入れ子になった thenable を平坦化することができます。つまり、thenable が別の thenable を呼び出して onFulfilled ハンドラーを実行するような場合です。この効果により、実際のプロミスの履行ハンドラーが thenable を履行値として受け取ることは決してありません。
プロミス機能を指定された関数に持たせるには、適切な時点で resolve および reject 関数を呼んでプロミスを返します。
resolveFunc を呼び出すとプロミスが解決されるため、その後 resolveFunc または rejectFunc を再度呼び出しても効果はありません。 ただし、プロミスは待機中、履行済みまたは拒否済みの、いずれかの状態を持つことがあります。
この pendingResolved プロミスは、作成された時点で解決されます。なぜなら、それはすでに内部プロミスの最終的な状態と一致するように「ロックイン」されているためであり、実行者内で後から resolveOuter や rejectOuter を呼び出したり、エラーが発生しても、最終的な状態には何の効果もありません。しかし、内部プロミスは 100 ミリ秒後まで待機状態であるため、外部プロミスも待機状態となります。
この fulfilledResolved プロミスは、それが解決された瞬間に履行されます。なぜなら、それはthenable ではない値で解決されるからです。しかし、それが作成された時点では、まだ resolve や reject が呼び出されていないため、未解決の状態です。未解決のプロミスは、必ず待機状態に置かれます。
rejectFunc を呼び出すと、明らかにプロミスが拒否されます。しかし、resolveFunc コールバックが呼び出された場合でも、プロミスを即座に拒否させるには、2 つの方法があります。
| ECMAScript® 2027 Language Specification # sec-promise-constructor |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年8月21日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.