JavaScriptでのPromise配列の操作
ここでは、Promise配列を扱うのに便利な2つのメソッドを
解説します。
メソッド Promise.all は、
配列として渡されたすべてのPromiseが完了するまで
コードの実行を待機し、
メソッド Promise.race は、
配列内の最初のPromiseが完了するのを待ち、
残りを破棄します。
両メソッドは、その結果として新しいPromiseを
返します。メソッド Promise.all の結果である
このPromiseの値は、渡されたすべてのPromiseの
結果を集めた配列になります
(結果の順序は配列内のPromiseの順序に対応します)。
一方、Promise.race の結果は、
最初に完了したPromiseの結果になります。
実際に見てみましょう。以下のようなPromiseの配列があるとします:
let promises = [
new Promise(resolve => setTimeout(() => resolve(1), 1000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 3000)),
];
Promise.all を使用して、
配列内のすべてのPromiseの完了を待ってみましょう:
Promise.all(promises).then(function(res) {
console.log(res); // [1, 2, 3] と表示されます - すべてのPromiseの結果
});
次に、Promise.race を使用して、
配列内の最初のPromiseの完了を待ってみましょう:
Promise.race(promises).then(function(res) {
console.log(res); // 1 と表示されます - 最初に完了したPromiseの結果
});
配列内のPromiseのうち1つでも拒否(rejected)されると、
結果を表すPromiseは即座に rejected 状態に
移行します。したがって、
発生した例外は、例えば catch を通じて、
これまで学習した通常の方法で捕捉することができます:
Promise.all(promises).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
内部に1秒から 10 秒までのランダムな遅延が
設定されたPromiseを返す関数を作成してください。
Promiseは、この遅延時間をその結果として返すものとします。
ループとあなたの関数を使用して、
配列を 10 個のPromiseで埋めてください。
前のタスクで作成したPromise配列を使用して、 コンソールに最初に完了したPromiseの結果が 表示されるようにしてください。
前のタスクで作成したPromise配列を使用して、 コンソールにすべてのPromiseの結果の合計が 表示されるようにしてください。