等待循环中调用的所有承诺完成
Waiting for all promises called in a loop to finish
我正在使用 the axios promise 库,但我认为我的问题更普遍。现在我正在循环处理一些数据并在每次迭代时进行一次 REST 调用。
每次调用完成时,我需要将 return 值添加到一个对象。在高层次上,它看起来像这样:
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.log
时,mainObject
中还没有任何数据,因为 axios 仍在伸出援手。处理这种情况的好方法是什么?
Axios 确实有一个 all
方法和一个姐妹 spread
方法,但如果您提前知道要进行多少次调用,它们似乎很有用,而在我的情况我不知道会有多少次循环迭代。
您需要将所有承诺收集到一个数组中,然后使用 Promise.all
:
// Example of gathering latest Stack Exchange questions across multiple sites
// Helpers for example
const apiUrl = 'https://api.stackexchange.com/2.2/questions?pagesize=1&order=desc&sort=activity&site=',
sites = ['Whosebug', 'ubuntu', 'superuser'],
myArrayOfData = sites.map(function (site) {
return {webAddress: apiUrl + site};
});
function convertToStringValue(obj) {
return JSON.stringify(obj, null, '\t');
}
// Original question code
let mainObject = {},
promises = [];
myArrayOfData.forEach(function (singleElement) {
const myUrl = singleElement.webAddress;
promises.push(axios.get(myUrl));
});
Promise.all(promises).then(function (results) {
results.forEach(function (response) {
const question = response.data.items[0];
mainObject[question.question_id] = {
title: question.title,
link: question.link
};
});
console.log(convertToStringValue(mainObject));
});
<script src="https://unpkg.com/axios@0.19.2/dist/axios.min.js"></script>
在axios docs(执行多个并发请求部分)中有描述。
2020 年 5 月之前,可以使用 axios.all()、which is now deprecated.
我正在使用 the axios promise 库,但我认为我的问题更普遍。现在我正在循环处理一些数据并在每次迭代时进行一次 REST 调用。
每次调用完成时,我需要将 return 值添加到一个对象。在高层次上,它看起来像这样:
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.log
时,mainObject
中还没有任何数据,因为 axios 仍在伸出援手。处理这种情况的好方法是什么?
Axios 确实有一个 all
方法和一个姐妹 spread
方法,但如果您提前知道要进行多少次调用,它们似乎很有用,而在我的情况我不知道会有多少次循环迭代。
您需要将所有承诺收集到一个数组中,然后使用 Promise.all
:
// Example of gathering latest Stack Exchange questions across multiple sites
// Helpers for example
const apiUrl = 'https://api.stackexchange.com/2.2/questions?pagesize=1&order=desc&sort=activity&site=',
sites = ['Whosebug', 'ubuntu', 'superuser'],
myArrayOfData = sites.map(function (site) {
return {webAddress: apiUrl + site};
});
function convertToStringValue(obj) {
return JSON.stringify(obj, null, '\t');
}
// Original question code
let mainObject = {},
promises = [];
myArrayOfData.forEach(function (singleElement) {
const myUrl = singleElement.webAddress;
promises.push(axios.get(myUrl));
});
Promise.all(promises).then(function (results) {
results.forEach(function (response) {
const question = response.data.items[0];
mainObject[question.question_id] = {
title: question.title,
link: question.link
};
});
console.log(convertToStringValue(mainObject));
});
<script src="https://unpkg.com/axios@0.19.2/dist/axios.min.js"></script>
在axios docs(执行多个并发请求部分)中有描述。
2020 年 5 月之前,可以使用 axios.all()、which is now deprecated.