7) 並列処理
all
APIを複数コールして全てのレスポンスが返った後に処理を行うような場合は、then()
を何度も呼ぶのではなくall()
を使います。
指定時間が経過した後に fulfilled になるサンプルを例にします。
function task(value,ms) {
return new Promise(function(resolve,reject){
setTimeout(resolve(value),ms);
});
}
function taskA(){ return task('A',100); };
function taskB(){ return task('B',200); };
function taskC(){ return task('C',50); };
Promise.all([taskA(),taskB(),taskC()])
.then(function(values){
console.info(values); // ['A','B','C']
})
;
- 渡されたPromise配列が全て fulfilled になった時、
all()
は fulfilled になります - 渡されたPromise配列のどれか一つでも rejected になった時、
all()
は rejected になります
allの実行順はどのようになっているのか
all()
は渡されたPromise配列をどのように処理しているのでしょうか。結果を待ってから次の処理に移っているのでしょうか?
検証してみましょう。
function task(value,ms) {
console.log(value + ' called');
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve(value);
console.log(value + ' fulfilled');
},ms);
});
}
function taskA(){ return task('A',3000); };
function taskB(){ return task('B',2000); };
function taskC(){ return task('C',1000); };
Promise.all([taskA(),taskB(),taskC()])
.then(function(values){
console.info('all fulfilled');
})
;
この例を実行すると以下のような結果が得られます。
- ほぼ同時に
A called
B called
C called
が出力される - 1秒後に
C fulfilled
が出力される - 2秒後に
B fulfilled
が出力される - 3秒後に
A fulfilled
が出力される all fulfilled
が出力される
この事からall()
は全Promiseを一斉に実行した後で、全部が fulfilled になるのを待っている事が分かります。(1つでも rejected になった場合は即時停止します)