JavaScript

Promise オブジェクト

 編集:2022.08.09 by T.A.

非同期処理の完了(もしくは失敗)の結果およびその結果の値を表します。

注: この機能は 内で利用可能です

プロミスの挙動と使用法について学ぶには、最初にをお読みください。

解説

プロミス(Promise)は、作成された時点では分からなくてもよい値へのプロキシーです。非同期のアクションの成功値または失敗理由にハンドラーを結びつけることができます。これにより、非同期メソッドは結果の値を返す代わりに、未来のある時点で値を提供するプロミスを返すことで、同期メソッドと同じように値を返すことができるようになります。

Promise の状態は以下のいずれかとなります。

待機状態のプロミスは、何らかの値を持つ履行(fulfilled)状態、もしくは何らかの理由(エラー)を持つ拒否(rejected)状態のいずれかに変わります。そのどちらとなっても、then メソッドによって関連付けられたハンドラーが呼び出されます。対応するハンドラーが割り当てられたとき、既にプロミスが履行または拒否状態になっていても、そのハンドラーは呼び出されます。よって、非同期処理とその関連付けられたハンドラーとの競合は発生しません。

Promise.prototype.then() メソッドと Promise.prototype.catch() メソッドもまたプロミスを返すので、これらを連鎖(chain)させることができます。

¶以下、図と例を省く

コンストラクター
new Promise()
新しい Promise オブジェクトを生成します。このコンストラクターは主に、まだプロミスに対応していない関数をラップするために使われます。
静的メソッド
Promise.all(iterable)
すべてのプロミスが解決されるか、拒否されるかするまで待ちます。

返却されたプロミスが解決された場合、解決されたプロミスが、複数のプロミスが含まれる反復可能オブジェクトで定義された順番で入った集合配列の値によって解決されます。

拒否された場合は、反復可能オブジェクトの中で拒否された最初のプロミスの理由によって拒否されます。

Promise.allSettled(iterable)
すべてのプロミスが完了する(それぞれが解決されるか、拒否される)まで待ちます。

これはすべての与えられたプロミスが解決または拒否された後で、それぞれのプロミスの結果を記述したオブジェクトの配列で解決される Promise を返します。

Promise.any(iterable)
Promise オブジェクトの反復可能オブジェクトを取り、反復可能オブジェクトの中のプロミスのうちの一つが履行され次第、そのプロミスから受け取った値で解決する単一のプロミスを返します。
Promise.race(iterable)
プロミスのうちの 1 つが解決または拒否されるまで待ちます。

返されたプロミスが解決された場合、反復可能オブジェクトの中で最初に解決されたプロミスの値によって解決されます。

拒否された場合、最初に拒否されたプロミスの理由によって拒否されます。

Promise.reject(reason)
与えられた理由で拒否された新しい Promise オブジェクトを返します。
Promise.resolve(value)
与えられた値で解決された新しい Promise オブジェクトを返します。もし値が thenable(つまり then メソッドを持っているオブジェクト)ならば、返されるプロミスはその thenable をたどり、その結果を採用します。そうでなければ、返されるプロミスは与えられた値で解決されます。

一般に、ある値がプロミスであるかどうかがわからない場合は、代わりに Promise.resolve(value) を使用し、返値をプロミスとして扱います。

インスタンス メソッド

マイクロ タスクのキューやサービスを使用する方法については、のガイドを参照してください。

Promise.catch()
プロミスに拒否ハンドラー コールバックを追加し、コールバックが呼び出されたときの返値で解決する、または、プロミスが履行された場合は、元の履行結果で解決する 新しいプロミスを返します。
Promise.then()
プロミスに履行ハンドラーと拒否ハンドラーを追加し、呼び出されたハンドラーの返値で解決する新しいプロミスを返します。プロミスが処理されなかった場合(すなわち、関連するハンドラー onFulfilled または onRejected が関数ではない場合)は、元の解決値を返します。
Promise.finally()
プロミスにハンドラーを追加し、元のプロミスが解決されたときに解決される新しいプロミスを返します。このハンドラーは、成功か失敗かに関わらず、元のプロミスが完了したときに呼び出されます。
基本的な例
//コンソールにて
let myFirstPromise = new Promise((resolve, reject) => {
	// 非同期処理が成功した場合は resolve(...) を呼び出し、失敗した場合は reject(...) を呼び出します。
	// この例では、setTimeout(...) を使用して非同期コードをシミュレートします。
	// 実際には、XHR や HTML5 API などを使用することになるでしょう。
  setTimeout( function() {
    resolve("Success!")  // Yay! Everything went well!
  }, 250)
})

myFirstPromise.then((successMessage) => {
	// successMessage は、上記の resolve(...) 関数で渡したものです。
	// 文字列である必要はありませんが、成功メッセージのみであれば文字列である可能性があります。
  console.log("Yay! " + successMessage)
});

¶省く


テスト