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月.
then() は Promise インスタンスのメソッドであり、最大 2 つの引数として、この Promise が成功した場合と失敗した場合のコールバック関数を取ります。コールバックは、それが呼び出されたプロミス内に格納され、すぐに別の Promise オブジェクトを返値において返し、他のプロミスのメソッドに対する連鎖呼び出しを行うことができます。
このプロミスが履行されたときに非同期に呼び出される関数です。この返値は、then() から返されるプロミスの履行値になります。この関数は以下の引数と共に呼び出されます。
valueこのプロミスが履行されたときの値。
これが関数ではない場合は、内部的に、履行された値を送るための 恒等 関数 ((x) => x) に置き換えられます。
onRejected 省略可このプロミスが拒否されたときに非同期に呼び出される関数です。この返値は、then() から返されるプロミスの履行値になります。この関数は以下の引数と共に呼び出されます。
reasonこプロミスが拒否されたときの値。
これが関数ではない場合は、内部的に引数として受け取ったエラーを投げる スロワー 関数 ((x) => { throw x; }) に置き換えられます。
新しい Promise をすぐに返します。この返されたプロミスは、現在のプロミスの状態に関係なく、返すときには常に待機状態です。
onFulfilled と onRejected ハンドラーのいずれかが実行され、現在のプロミスの履行されたか拒否されたかが処理されます。この呼び出しは、現在のプロミスが既に決定されている場合でも、常に非同期で行われます。 then() が返すプロミス(以下、 p と呼ぶ)の動作は、一連の特定のルールに従って、ハンドラーの実行結果によって決まります。もしハンドラー関数が、
then() メソッドは、プロミスの最終的な完了(履行されるか拒否されるか)のためにコールバック関数をスケジュールします。これはプロミスの基本メソッドです。Thenable プロトコルはすべてのプロミス型オブジェクトが then() メソッドを公開することを想定しており、catch() と finally() メソッドは、どちらもオブジェクトの then() メソッドを呼び出すことで動作するようになっています。
onRejected ハンドラーの詳細については、 catch() のリファレンスを参照してください。
then() は新しいプロミスオブジェクトを返しますが、呼び出されたプロミスオブジェクトを変更し、ハンドラーを内部リストに追加します。 したがって、ハンドラーは元のプロミスによって保持され、その寿命は少なくとも元のプロミスの寿命と同じ長さになります。 例えば、次の例では、返されたプロミスが保持されないにもかかわらず、最終的にはメモリーを使い果たします。
then() は、新しいプロミスオブジェクトを返すことです。 同じプロミスオブジェクトで then() メソッドを 2 回呼び出すと(連鎖するのではなく)、このプロミスオブジェクトは 2 組の決定ハンドラーを保有することになります。同じプロミスオブジェクトに付けられたすべてのハンドラーは、常に追加された順番に呼び出されます。さらに、 then() の各呼び出しによって返される 2 つのプロミスは、別個の連鎖を始め、お互いの決定を待つことはありません。
then() チェーンに沿って発生する Thenable オブジェクトは常に解決されます。onFulfilled ハンドラーは thenable オブジェクトを決して受け取らず、いずれかのハンドラーによって返される thenable は常に次のハンドラーに渡される前に解決されます。これは、新しいプロミスを構築するときに、 executor から渡された resolve 関数と reject 関数が保存され、現在のプロミスが決定したときに、それぞれの関数が履行された値または拒絶の理由とともに呼び出されるからです。解決ロジックは、 Promise() コンストラクターから渡されるリゾルバー関数から決まります。
then() はサブクラス化に対応しており、Promise のサブクラスのインスタンスに対して呼び出すことができ、その結果はサブクラスの型のプロミスになります。返す値の種類は [Symbol.species] プロパティでカスタマイズすることができます。
then メソッドは Promise を返すので、メソッド連鎖ができます。
then にハンドラーとして渡された関数が Promise を返す場合、同じ Promise がメソッド連鎖の次の then に現れます。次のスニペットは、非同期実行をシミュレートする、 setTimeout 関数付きのコードです。
then() から返される値は、Promise.resolve() と同じ方法で解決されます。つまり、Thenable オブジェクトが対応していて、返値がプロミスでない場合は、暗黙のうちに Promise でラップされ、その後解決されます。
then の引数として渡した関数が拒否されたプロミスを返した場合や、例外(エラー)が発生した場合は、拒否されたプロミスを返します。
現実的には、catch() を使って拒否されたプロミスを捕捉する方が、 then() の 2 つの引数の構文を使って処理するよりも現実的です。下記の例を見てください。
他にもすべての場合において、返されたプロミスは最終的に履行されます。以下の例では、最初の then() は、チェーン内の前のプロミスが拒否されたにもかかわらず、履行されたプロミスに包まれた 42 を返します。
もし onFulfilled がプロミスを返した場合、 then の返値はそのプロミスの最終的な状態に基づいて履行される/拒否されることになります。
プロミスベースの API を使用する関数を別の関数の上に実装するために、チェーニングを使用することができます。
以下は then メソッドの非同期性を示す例である。
| ECMAScript® 2027 Language Specification # sec-promise.prototype.then |
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.