gpt4 book ai didi

javascript - 等待 async .map() 完成后如何返回推送的数组?

转载 作者:行者123 更新时间:2023-12-02 22:58:46 25 4
gpt4 key购买 nike

最终结果将存储在下面的locations 数组中。

const locations = []

我创建了一个接受 location 参数的异步函数,locationSearch 将使用该参数向 Google 地方信息发出 GET 请求。

const locationSearch = await (
axios.get(`https://maps.googleapis.com/maps/api/place/textsearch/json?query=${location}`, {json: true})
.then(response => {
if(response.data.results.length < 1) throw new Error('Unable to find location.')

return response.data.results
}).catch(error => {
return error
})
)

结果返回一个地点数组,然后我将其传递给 locationSearch 以使用 place_id 获取更多详细信息。

const locationDetails = await locationSearch.map(async (locationData) => {
const { place_id: id } = locationData

await (
axios.get(`https://maps.googleapis.com/maps/api/place/details/json?placeid=${id}`, {json: true})
.then(locationDetails => {
if(locationDetails.data.result.length === 0) throw new Error('Unable to find location ID!')

const { name, geometry, types, photos, rating, user_ratings_total, opening_hours, icon, formatted_address, formatted_phone_number, price_level, reviews } = locationDetails.data.result
locations.push({
latitude: geometry.location.lat,
longitude: geometry.location.lng,
types,
reviews,
photos,
rating,
user_ratings_total,
opening_hours,
icon,
name,
location: formatted_address,
formatted_phone_number,
price_level
})
}).catch(error => {
return error
})
)
})

但是,我不确定应该返回位置,因为 locationDetails 仅用于将结果映射到 locations。已解决的 Promise 返回如下:

return Promise.all(locationSearch, locationDetails)

我希望这个问题不会显得很愚蠢。此外,任何有关所编写代码的错误的反馈或指示将不胜感激!

最佳答案

使用 async/await,您无需使用 .then.catch 等 Promise api — 它是使用 Promise 结构的替代方案。它应该看起来更像这样:

async function getLocationData (location) {
try {
const { data } = axios.get(
`https://maps.googleapis.com/maps/api/place/textsearch/json?query=${location}`,
{ json: true }
)

if (data.results) {
const locationDetails = await Promise.all(
data.results.map(({ place_id }) =>
// for each of these, catch any errors and return null so you know you got nothing
// but it won't kill the entire batch of requests
axios.get(
`https://maps.googleapis.com/maps/api/place/details/json?placeid=${id}`,
{ json: true }
).catch(() => null)
)
)
return locationDetails.reduce((arr, details) => {
// only add the data if it exists
if (Array.isArray(details.result) && details.result.length) {
const {
name,
geometry,
types,
photos,
rating,
user_ratings_total,
opening_hours,
icon,
formatted_address,
formatted_phone_number,
price_level,
reviews
} = details

return [
...arr,
{
latitude: geometry.location.lat,
longitude: geometry.location.lng,
types,
reviews,
photos,
rating,
user_ratings_total,
opening_hours,
icon,
name,
location: formatted_address,
formatted_phone_number,
price_level
}
]
}
// otherwise it's an errored result (null) or no match
// so return the accumulated array (essentially a filter)
return arr
}, [])
} else {
throw new Error('Unable to find location')
}
} catch (err) {
return err
}
}

这里要注意的主要事情是,一旦任何请求失败,Promise.all 就会停止。因此,您可以将 .catch 添加到 Promise.all 映射中的每个 axios 调用,以防止整个批处理被拒绝。然后,您将获得一个与位置结果数量匹配的数组,并且您现在将获得失败的结果,因为它们将为 null,或者您想要为失败的请求返回的任何内容。

此外,在处理错误的方式上保持一致也是一个好主意。要么一直抛出,要么一直返回。

关于javascript - 等待 async .map() 完成后如何返回推送的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57863446/

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