2016-05-13 3 views
6

Я использую the axios библиотеку обещаний, но мой вопрос применяется в более общем плане, я думаю. Прямо сейчас я перебираю некоторые данные и делаю один вызов 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 есть метод all вместе с сестрой spread, но они кажутся вам полезными, если вы знаете заранее, сколько звонков вы будете делать, тогда как в моем случае я не знаю, сколько итерации цикла будут.

ответ

22

Вы должны собрать все свои обещания массива затем использовать 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