我有一个链接数组,我想从中获取响应数据,使用该响应中的特定数据填充对象,然后通过路径发送带有响应数据的对象数组。
const apartmentObjectArray = apartmentLinks.map((link) => {
helper.sendApartmentData(link)
});
res.send(apartmentObjectArray);
我遇到的问题是,在发送响应之前,响应才会得到解决。我尝试在响应之前创建一个变量,并将对象分配给该变量,但这不起作用。我问过的每个人都说异步调用是如何工作的,这很好,他们可以告诉我,但他们没有告诉我解决问题的方法。
function sendApartmentData(link) {
axios.get(link).then(response => {
parseString(response.data, (err, result) => {
const code = access(result, 'SearchResults:searchresults.message[0].code[0]');
if (code !== '0') {
console.log('An error occured');
} else {
const resultArray = access(result, 'SearchResults:searchresults.response[0].results[0].result');
resultArray.forEach(obj => {
const dataObj = {};
// populate dataObj...
});
}
});
});
}
答案 0 :(得分:0)
您应该使用Promise.all
。
Promise.all(iterable)方法返回一个Promise,它在iterable参数中的所有promise都已解析或者iterable参数不包含promise时解析。它拒绝承认拒绝的第一个承诺。
这是一种简单的方法,可以在完成所有需要执行的异步操作后立即执行一段代码。一旦异步操作失败,它也会失败。
let apartmentDataPromises = [];
apartmentLinks.map((link) => {
apartmentDataPromies.push(helper.sendApartmentData(link));
});
Promise.all(apartmentDataPromises).then(apartmentObjectArray => {
res.send(apartmentObjectArray);
}).catch(err => console.log(err));
function sendApartmentData(link) {
return new Promise((resolve, reject) => {
axios.get(link).then(response => {
parseString(response.data, (err, result) => {
const code = access(result,'SearchResults:searchresults.message[0].code[0]');
if (code !== '0') {
reject('An error occured');
} else {
const resultArray = access(result,'SearchResults:searchresults.response[0].results[0].result');
resultArray.forEach(obj => {
const dataObj = {};
// populate dataObj...
resolve(dataObj);
});
}
});
});
});
}