gpt4 book ai didi

javascript - 在 Promise.all 中使用 .map

转载 作者:行者123 更新时间:2023-12-04 01:53:10 25 4
gpt4 key购买 nike

所以,我有一些需要在 Express 服务器的 init 上运行的 promise 。

const dates = [];
for (var i = 0; i <= 8; i++) {
dates.push(
moment()
.add(i, "days")
.format("YYYY-MM-DD")
);
}
const [cityName, weatherData, celestialData] = await Promise.all([
axios.get(
`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}&key=${myKey}`
),
axios.get(
`https://api.darksky.net/forecast/${myKey}/${latitude},${longitude}`
),
dates.map(date => {
axios.get(
`https://api.ipgeolocation.io/astronomy?apiKey=${myKey}&lat=${latitude}&long=${longitude}&date=${date}`
);
})
]);

我需要 8 个不同天的数据,所以我想通过使用日期数组运行 .map,我会得到另一个数组,其中包含每个数组的已解决 promise 。这并不像我预期的那样工作。如何管理 Promise.all 内循环的 axios 调用?

最佳答案

你们真的很接近。你想要

  1. 展开 dates.map 中的数组
  2. 在解构过程中捕获剩余元素的结果
  3. map回调中返回axios的结果

大致:

const [cityName, weatherData, ...celestialData] = await Promise.all([
// 2 −−−−−−−−−−−−−−−−−−−−−−−−−^^^
axios.get(
`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}&key=${myKey}`
),
axios.get(
`https://api.darksky.net/forecast/${myKey}/${latitude},${longitude}`
),
...dates.map(date => {
//^^^−−−− 1
return axios.get(
//−−^^^^^^ 3
`https://api.ipgeolocation.io/astronomy?apiKey=${myKey}&lat=${latitude}&long=${longitude}&date=${date}`
);
})
]);

celestialData 将是日期结果的数组。

如果您愿意,您可以为第三部分使用简洁的箭头函数:

  ...dates.map(date => axios.get(
`https://api.ipgeolocation.io/astronomy?apiKey=${myKey}&lat=${latitude}&long=${longitude}&date=${date}`
)

旁注:您当前创建 dates 数组的方式很好,但如果您愿意,您可以使用 Array.from 的映射功能:

const dates = Array.from(
Array(9),
(_, i) => moment().add(i, "days").format("YYYY-MM-DD")
);

Seblor尚未将其作为答案发布,这里是 their approach (这对我来说似乎更好,因为它避免了展开数组只是为了在解构中使用剩余元素再次将其收集起来):

const [cityName, weatherData, celestialData] = await Promise.all([
axios.get(
`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}&key=${myKey}`
),
axios.get(
`https://api.darksky.net/forecast/${myKey}/${latitude},${longitude}`
),
Promise.all(dates.map(date => {
return axios.get(
`https://api.ipgeolocation.io/astronomy?apiKey=${myKey}&lat=${latitude}&long=${longitude}&date=${date}`
);
}))
]);

关于javascript - 在 Promise.all 中使用 .map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60656649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com