目次へ戻る


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']
  })
;

plunker

  • 渡された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');
  })
;

plunker

この例を実行すると以下のような結果が得られます。

  • ほぼ同時にA called B called C calledが出力される
  • 1秒後にC fulfilledが出力される
  • 2秒後にB fulfilledが出力される
  • 3秒後にA fulfilledが出力される
  • all fulfilledが出力される

この事からall()は全Promiseを一斉に実行した後で、全部が fulfilled になるのを待っている事が分かります。(1つでも rejected になった場合は即時停止します)


前のページ 次のページ