axios 如何将从对API的响应中接收到的多个值添加到数组中

vbopmzt1  于 2023-02-22  发布在  iOS
关注(0)|答案(1)|浏览(173)

我使用google maps API来比较地址和坐标,并且能够计算出哪条路线的公里数最少。我正在经历一个循环,因为我的目的地地址可能很多,我需要得到从我的出发地到我的多个目的地的距离。我已经得到了我经过的路线的公里数。但是我需要把这些KM加到一个数组中,然后比较它们,看看最小的KM距离是多少,但是,我不能把它们保存在数组中,它总是返回空。

const coordLat = '14.080625';
const coordLog = '-87.183783';

/*This is what my array of objects looks like with my coordinates for the destination and they can be multiple more*/
coord = [
  { lat: '14.100227', log: '-87.180941' },
  { lat: '14.098654', log: '-87.178463' }
]

let compareCoord = [];
  coords.forEach(async coord => {
     let resp = await axios.get(`https://maps.googleapis.com/maps/api/distancematrix/json?origins=${coordLat}%2C${coordLog}&destinations=${coord.lat}%2C${coord.log}%7C&units=metric&key=API-KEY&callback`);
     console.log(resp.data.rows[0].elements[0].distance.value);
     /*Here it should fill my array every time it is iterated*/
     compareCoord.push(resp.data.rows[0].elements[0].distance.value)
                       
  });

console.log(compareCoord);

console.log(resp.data.rows[0].elements[0].distance.value)返回KM的值(例如:3.9 3870 km和3818 km,然后我必须找出需要存储在数组中的距离中较小的一个,但是当我执行compareCoord.push(resp.data.rows[0].elements[0].distance.value)时,它返回一个空数组。
我不知道是否正确使用了“异步/等待"。

jm2pwxwz

jm2pwxwz1#

代码的问题在于axios.get函数返回了一个Promise,而这个Promise是异步解析的,这意味着forEach循环中的代码在Promise被解析和compareCoord数组被填充之前会继续执行。
解决这个问题的一个方法是使用Promise.all等待所有Promises都解决后再返回compareCoord数组。下面是修改代码的方法:

const coordLat = '14.080625';
const coordLog = '-87.183783';

const coord = [
  { lat: '14.100227', log: '-87.180941' },
  { lat: '14.098654', log: '-87.178463' }
];

const getDistance = async (coord) => {
  const resp = await axios.get(`https://maps.googleapis.com/maps/api/distancematrix/json?origins=${coordLat}%2C${coordLog}&destinations=${coord.lat}%2C${coord.log}%7C&units=metric&key=API-KEY&callback`);
  return resp.data.rows[0].elements[0].distance.value;
};

const compareCoord = await Promise.all(coord.map(getDistance));
console.log(compareCoord);

在这个修改过的代码中,我们定义了一个新的函数getDistance,它接受一个coord对象,并返回一个解析为distance值的Promise。然后,我们使用map方法将这个函数应用于coord数组的每个元素,并返回一个Promise数组。最后,我们使用Promise.all等待所有的Promise得到解析,并返回compareCoord数组。
注意,我们使用async/await使代码更可读、更容易理解。如果你愿意,你也可以使用传统的then语法来处理Promises。

相关问题