【JavaScript】Promiseについて
以下のリンクを使って、各セクションにジャンプできます。
Promise.all()について
Promise.all()
は、複数のPromiseを並行して実行し、すべてが成功した時に結果をまとめて返すメソッドです。すべてのPromiseが解決(fulfilled)された場合、返されたPromiseはその解決値を配列として返します。
ただし、1つでも失敗(rejected)した場合、その時点で全体が失敗として扱われ、最初に失敗したPromiseのエラーが返されます。つまり、すべてのPromiseが成功することが条件です。
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 1000, 'Success'));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 2000, 'Success'));
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 3000, 'Success'));
Promise.all([promise1, promise2, promise3]).then((results) => {
console.log(results); // ['Success', 'Success', 'Success']
}).catch((error) => {
console.log(error);
});
上記の例では、3つのPromiseがすべて成功したため、結果として「[‘Success’, ‘Success’, ‘Success’]」が出力されます。もし、どれかが失敗した場合、そのエラーがキャッチされます。
Promise.race()について
Promise.race()
は、複数のPromiseのうち、最初に解決または拒否されたPromiseの結果を返します。最初に完了したPromiseだけが扱われ、その後に他のPromiseが解決しても無視されます。
このメソッドは、どのPromiseが最初に結果を返すかを重視する場合に便利です。
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 1000, 'First'));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'Second'));
Promise.race([promise1, promise2]).then((result) => {
console.log(result); // 'Second'
});
上記の例では、promise2
が500msで最初に解決され、その結果「’Second’」が出力されます。
Promise.any()について
Promise.any()
は、複数のPromiseのうち、最初に解決したPromiseの結果を返します。もし、すべてのPromiseが拒否された場合は、エラーを返します。つまり、最初に成功したPromiseを待ち、その結果を使用しますが、すべてが失敗した場合はエラーが発生します。
const promise1 = new Promise((resolve, reject) => setTimeout(reject, 1000, 'Error 1'));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'Success'));
Promise.any([promise1, promise2]).then((result) => {
console.log(result); // 'Success'
}).catch((error) => {
console.log(error);
});
上記の例では、promise2
が500msで最初に成功し、その結果「’Success’」が出力されます。
Promise.allSettled()について
Promise.allSettled()
は、すべてのPromiseが解決または拒否されるのを待ってから、その結果を返します。成功した場合は解決値、失敗した場合はエラーを返すため、すべてのPromiseの結果を把握したい場合に便利です。
すべてのPromiseの最終的な結果がわかるため、Promise.all()
のようにエラーが発生して処理が止まることがありません。
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 1000, 'Success'));
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 500, 'Error'));
Promise.allSettled([promise1, promise2]).then((results) => {
console.log(results);
// [
// { status: 'fulfilled', value: 'Success' },
// { status: 'rejected', reason: 'Error' }
// ]
});
上記の例では、2つのPromiseが処理され、1つは成功、もう1つは失敗した結果が出力されます。それぞれの結果はオブジェクトとして提供され、「status」プロパティに成功なら「fulfilled」、失敗なら「rejected」が設定されます。