JavaScript

Promise.prototype.then()メソッド

 編集:2022.10.21 by T.A.

Promise を返します。

最大 2 つの引数として、Promise が成功した場合と失敗した場合のコールバック関数を取ります。

Note: 片方または両方の引数が省略されたり、関数ではないものが渡されたりした場合、 then にはハンドラーが不足しますが、エラーは発生しません。Promise が状態(履行 (fulfillment) または拒否 (rejection))を受け入れるに当たって then が呼び出された際に、then がハンドラーを持たない場合は、then が呼び出された元の Promise の最後の状態を受け入れた、追加のハンドラーのない新しい Promise が生成されます。

Prom.then(onFulfilled[, onRejected])
Prom.then(value => {
  履行処理
}[, reason => {
  拒否処理
}]);
Prom Promise
onFulfilled 省略可。Promise が成功したときに呼び出される関数(Function)です。この関数は 1 つの引数、fulfillment value を持ちます。これが関数ではない場合は、内部的に "Identity" 関数(受け取った引数を返す関数)に置き換えられます。
onRejected 省略可。Promise が拒否されたときに呼び出される関数(Function)です。この関数は 1 つの引数、rejection reason を持ちます。これが関数ではない場合は、内部的に "Thrower" 関数(引数として受け取ったエラーを投げる関数)に置き換えられます。
value ¶変数。
reason ¶変数。
戻り値

Promise が履行されるか拒否されると、それぞれのハンドラー関数(onFulfilled または onRejected)が非同期に呼び出されます(現在のスレッド ループにスケジュールされます)。ハンドラー関数のこの動作は特定の一連の規則に従います。もしハンドラー関数が・・・

以下は、then メソッドの非同期性を示す例です。

解決されたプロミスを使用すし、'then'ブロックは即座にトリガーされ、ただし、そのハンドラーは、console.logs で示されているように非同期でトリガーされます。

//コンソールにて
const resolvedProm = Promise.resolve(33);

let thenProm = resolvedProm.then(value => {
    console.log("this gets called after the end of the main stack. the value received and returned is: " + value);
    return value;
});
//thenPromの値を即座にログに記録します
console.log(thenProm);

//setTimeoutを使用すると、スタックが空になるまで関数の実行を延期できます。
setTimeout(() => {
    console.log(thenProm);
});

//ログ(この順で)
//Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
//"this gets called after the end of the main stack. the value received and returned is: 33"
//Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 33}

¶省く

//コンソールにて
var p1 = new Promise((resolve, reject) => {
  resolve('Success!');
  // or
  // reject(new Error("Error!"));
});

p1.then(value => {
  console.log(value); // Success!
}, reason => {
  console.error(reason); // Error!
});

テスト