Promise.all(iterable)メソッドは、 iterable のすべての Promise が完了したときや、iterable な引数に Promise が含まれないときに、完了した Promiseを返します。最初に失敗した Promise の失敗理由とともに失敗を返します。

構文

Promise.all(iterable);

引数

iterable
ArrayString のようなiterable(反復可)オブジェクト。

返り値

  • 渡したiterable が空の場合、すでにresolveされた Promise
  • 渡したiterable に Promise がない場合、非同期にresolveされた Promise。ただし、Google Chrome 58 ではこの場合すでに resolved promiseを返す。
  • その他の場合はペンディング Promise 。この返却されるpromise は次に、iterable として与えられたすべての promise が resolve されるか、すべての promise が reject されると非同期に(スタックが空になるとすぐに) resolve/rejecte される。以下の "Asynchronicity or synchronicity of Promise.all" の例を見てください。返り値は、実行完了の順とは関係なく、Promises が渡された順番で並ぶ。

説明

このメソッドは複数のpromiseの結果を集約するのに便利です。

完成:
空の iterable が渡された場合、このメソッドはすでにresolveしたpromiseを(同期的に)返します。
渡された promises のすべてが満たされるか、promiseが渡されていない場合、 Promise.all によって返されるpromise が非同期的に完成されます。
すべての場合で、返された Promise は、引数として渡された iterable のすべての値を含んだ(非promiseな値も)配列で完成されます。

Rejection:
渡された Promise のいずれかがリジェクトされたら、 Promise.all は非同期的に、その他の Promise が完了しているかどうかに関係なく、そのリジェクトした Promise の値でリジェクトします。

Promise.allの使用

Promise.allはすべての成功(または最初の失敗)を待ちます。

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, "foo");
}); 

Promise.all([p1, p2, p3]).then(function(values) { 
  console.log(values); // [3, 1337, "foo"] 
});

iterable に非promiseな値が含まれる場合、無視されますが、返される Promise 配列の値にはカウントされます (Promise が成功する場合):

// this will be counted as if the iterable passed is empty, so it gets fulfilled
var p = Promise.all([1,2,3]);
// this will be counted as if the iterable passed contains only the resolved promise with value "444", so it gets fulfilled
var p2 = Promise.all([1,2,3, Promise.resolve(444)]);
// this will be counted as if the iterable passed contains only the rejected promise with value "555", so it gets rejected
var p3 = Promise.all([1,2,3, Promise.reject(555)]);

// using setTimeout we can execute code after the stack is empty
setTimeout(function(){
    console.log(p);
    console.log(p2);
    console.log(p3);
});

// logs
// Promise { <state>: "fulfilled", <value>: Array[3] }
// Promise { <state>: "fulfilled", <value>: Array[4] }
// Promise { <state>: "rejected", <reason>: 555 }

Asynchronicity or synchronicity of Promise.all

以下の例では Promise.all の非同期性 (または渡されたiterable が空の場合、同期性) を実演します:

// we are passing as argument an array of promises that are already resolved,
// to trigger Promise.all as soon as possible
var resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];

var p = Promise.all(resolvedPromisesArray);
// immediately logging the value of p
console.log(p);

// using setTimeout we can execute code after the stack is empty
setTimeout(function(){
    console.log('the stack is now empty');
    console.log(p);
});

// logs, in order:
// Promise { <state>: "pending" } 
// the stack is now empty
// Promise { <state>: "fulfilled", <value>: Array[2] }

Promise.all がrejectしたときも同じことが起きます:

var mixedPromisesArray = [Promise.resolve(33), Promise.reject(44)];
var p = Promise.all(mixedPromisesArray);
console.log(p);
setTimeout(function(){
    console.log('the stack is now empty');
    console.log(p);
});

// logs
// Promise { <state>: "pending" } 
// the stack is now empty
// Promise { <state>: "rejected", <reason>: 44 }

しかし、Promise.all は渡された iterable が空の場合だけに同期的に resolve します:

var p = Promise.all([]); // will be immediately resolved
var p2 = Promise.all([1337, "hi"]); // non-promise values will be ignored, but the evaluation will be done asynchronously
console.log(p);
console.log(p2)
setTimeout(function(){
    console.log('the stack is now empty');
    console.log(p2);
});

// logs
// Promise { <state>: "fulfilled", <value>: Array[0] }
// Promise { <state>: "pending" }
// the stack is now empty
// Promise { <state>: "fulfilled", <value>: Array[2] }

Promise.allのフェイルファストの挙動

Promise.all は要素のひとつでも失敗したときに失敗し、フェイルファスト(fail fast)します。タイムアウト後に完了する4つのプロミスと、すぐに失敗する1つのプロミスが存在するとき、Promise.allは直ちに失敗します。

var p1 = new Promise(function(resolve, reject) { 
  setTimeout(resolve, 1000, "one"); 
}); 
var p2 = new Promise(function(resolve, reject) { 
  setTimeout(resolve, 2000, "two"); 
});
var p3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 3000, "three");
});
var p4 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 4000, "four");
});
var p5 = new Promise(function(resolve, reject) {
  reject("reject");
});

Promise.all([p1, p2, p3, p4, p5]).then(function(value) { 
  console.log(value);
}, function(reason) {
  console.log(reason)
});

//From console:
//"reject"

//You can also use .catch
Promise.all([p1, p2, p3, p4, p5]).then(values => { 
  console.log(values);
}).catch(reason => { 
  console.log(reason)
});

//From console: 
//"reject"

仕様

仕様 状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Promise.all の定義
標準 Initial definition in an ECMA standard.
ECMAScript Latest Draft (ECMA-262)
Promise.all の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応32 あり29 なし198
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応4.4.432 あり29 あり8 あり

関連情報

ドキュメントのタグと貢献者

このページの貢献者: Uemmra3, fscholz, akiomik, shide55
最終更新者: Uemmra3,