2016-05-13 15 views
6

Sto usando la libreria di promemoria the axios, ma la mia domanda si applica più in generale penso. In questo momento sono in loop su alcuni dati e facendo una singola chiamata REST per iterazione.
Al termine di ogni chiamata, è necessario aggiungere il valore restituito a un oggetto. Ad alto livello, sembra che questo:In attesa di tutte le promesse chiamate in un ciclo per finire

var mainObject = {}; 

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

console.log(convertToStringValue(mainObject)); 

Quello che sta succedendo, naturalmente, è quando chiamo console.log il mainObject non ha tutti i dati in esso ancora, dal momento che Axios è ancora raggiungendo fuori. Qual è un buon modo di affrontare questa situazione?

Axios ha un metodo all insieme a uno sorella spread uno, ma sembrano essere utili se si conosce in anticipo quante chiamate si effettueranno, mentre nel mio caso non so quante loop iterazioni ci saranno.

risposta

22

è necessario raccogliere tutte le vostre promesse a Array Un quindi utilizzare 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)); 

è descritto in axios docs