この翻訳は不完全です。英語から この記事を翻訳 してください。

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 される。以下の「 Promise.all の非同期性・同期性」の例を見てください。返り値は、実行完了の順とは関係なく、Promises が渡された順番で並びます。

説明

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

完成:
空の iterable が渡された場合、このメソッドはすでに resolve した promise を(同期的に)返します。
渡された promise のすべてが満たされるか、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 }

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((resolve, reject) => { 
  setTimeout(resolve, 1000, 'one'); 
}); 
var p2 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 2000, 'two'); 
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 3000, 'three');
});
var p4 = new Promise((resolve, reject) => {
  setTimeout(resolve, 4000, 'four');
});
var p5 = new Promise((resolve, reject) => {
  reject('reject');
});

Promise.all([p1, p2, p3, p4, p5]).then(values => { 
  console.log(values);
}, 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"

It is possible to change this behaviour by handling possible rejections:

var p1 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 1000, 'p1_delayed_resolvement'); 
}); 

var p2 = new Promise((resolve, reject) => {
  reject(new Error('p2_immediate_rejection'));
});

Promise.all([
  p1.catch(error => { return error }),
  p2.catch(error => { return error }),
]).then(values => { 
  console.log(values[0]) // "p1_delayed_resolvement"
  console.log(values[1]) // "Error: p2_immediate_rejection"
})

仕様

仕様書 策定状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Promise.all の定義
標準 ECMA標準としての初期定義。
ECMAScript Latest Draft (ECMA-262)
Promise.all の定義
ドラフト  

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 32Edge 完全対応 ありFirefox 完全対応 29IE 未対応 なしOpera 完全対応 19Safari 完全対応 8WebView Android 完全対応 4.4.3Chrome Android 完全対応 32Edge Mobile 完全対応 ありFirefox Android 完全対応 29Opera Android 完全対応 ありSafari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12

凡例

完全対応  
完全対応
未対応  
未対応

関連情報

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

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