web-dev-qa-db-ja.com

ループで呼び出されるすべての約束が完了するのを待つ

axios promiseライブラリを使用していますが、私の質問はより一般的に当てはまります。今、私はいくつかのデータをループして、反復ごとに単一のREST呼び出しを行っています。
各呼び出しが完了すると、オブジェクトに戻り値を追加する必要があります。高レベルでは、次のようになります。

var mainObject = {};

myArrayOfData.forEach(function(singleElement){
  myUrl = singleElement.webAddress;
  axios.get(myUrl)
  .then(function(response) {
    mainObject[response.identifier] = response.value;
   });
});

console.log(convertToStringValue(mainObject));

もちろん、私がconsole.logmainObjectにはまだデータがありません。axiosがまだアクセスしているからです。この状況に対処する良い方法は何ですか?

Axiosにはallメソッドと姉妹spreadメソッドがありますが、事前にいくつの呼び出しを行うかがわかっている場合に役立つように見えますが、私の場合はループの繰り返しがいくつあるかわかりません。

16
jkj2000

すべてのプロミスを配列に収集し、axios.allを使用する必要があります。

var mainObject = {},
    promises = [];

myArrayOfData.forEach(function(singleElement){
  myUrl = singleElement.webAddress;
  promises.Push(axios.get(myUrl))
});

axios.all(promises).then(function(results) {
    results.forEach(function(response) {
        mainObject[response.identifier] = response.value;
    })
});

console.log(convertToStringValue(mainObject));

axios docs で説明されています

48
krasu