web-dev-qa-db-fra.com

En attente de toutes les promesses appelées en boucle pour terminer

J'utilise l'axios bibliothèque de promesses, mais ma question s'applique plus généralement, je pense. En ce moment, je fais une boucle sur certaines données et je fais un seul appel REST par itération.
À la fin de chaque appel, je dois ajouter la valeur de retour à un objet. À un niveau élevé, cela ressemble à ceci:

var mainObject = {};

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

console.log(convertToStringValue(mainObject));

Ce qui se passe bien sûr, c'est quand j'appelle console.log le mainObject ne contient pas encore de données, car axios continue de tendre la main. Quelle est la bonne façon de gérer cette situation?

Axios a une méthode all avec une sœur spread, mais elles semblent être utiles si vous savez à l'avance combien d'appels vous allez faire, alors que dans mon cas, je Je ne sais pas combien d'itérations de boucle il y aura.

16
jkj2000

Vous devez collecter toutes vos promesses dans un tableau, puis utiliser 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));

Il est décrit dans les documents axios

48
krasu