gpt4 book ai didi

javascript - JS 数组映射返回空

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

我正在尝试使用映射在对象数组中返回一个新字段,一旦我这样做,它就会返回空。

预期结果:

[
{
"id": 2,
"name": "awesome stadium",
"opened": "1970-01-01T00:00:00.000Z",
"capacity": "39590.00",
"location": "some awesome",
"team_id": "147ff48e",
"team": {
"name": "some name",
"location": "some location"
}
}
]

代码:

    const venues = await connection(VENUE_TABLE)
.limit(LIMIT_PER_PAGE)
.offset((page - 1) * LIMIT_PER_PAGE)
.select('*');

const venuesWithTeam = venues.map(async (element) => ({
...element,
team: await connection('team')
.where('id', element.team_id)
.select('*')
.first(),
}));

return response.json(venuesWithTeam);

我该怎么做才能使其按预期工作?

最佳答案

async 函数始终返回 Promise,但 .map 不会“等待”这些 Promise(它只是将它们“按原样”放入结果中)。如果你想得到所有的结果,最简单的方法是 Promise.all :

const venuesWithTeam = await Promise.all(venues.map(async (element) => ({
...element,
team: await connection('team')
.where('id', element.team_id)
.select('*')
.first(),
})));

注意:这将开始并行(同时)运行所有操作,并等待所有操作解决后再继续。如果 venues 是一个非常大的数组,则可能会导致与数据库的大量连接,并可能导致一些问题。

要依次运行请求,您必须循环并等待前一个请求得到解决。一种方法是使用 reduce 来完成。

const venuesWithTeam = await venues.reduce((prom, element) => (
prom.then(async result => (
result.concat({
...element,
team: await connection('team')
.where('id', element.team_id)
.select('*')
.first(),
})
))
), Promise.resolve([]));

关于javascript - JS 数组映射返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61315162/

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