gpt4 book ai didi

javascript - 如何在嵌套映射函数中进行并发异步调用

转载 作者:行者123 更新时间:2023-11-29 15:07:11 25 4
gpt4 key购买 nike

我有一个对象,它有一个嵌套的对象数组,它有另一个嵌套的对象数组。我有一个异步函数来检查它们是否有效。我希望它同时运行,但我想等待所有的 promise 返回。现在我有:

function validate(userId): Promise<User> {
let user = await this.userRepo.findById(input).catch(err => this.handleNotExistent(err))
let friends = user.friends || []
await Promise.all(friends.map(async friend => {
let validFriend = await this.friendRepo.findById(friend.id).catch(err => this.handleNotExistent(err))
if (validFriend.name != friend.name || validFriend.age != friend.age) {
this.handleInvalidRequest()
}
else {
let friendOfFriends = friend.friendOfFriends || []
return await Promise.all(friendOfFriends.map(async friendOfFriend => {
let validFOF = await this.FOFRepo.findById(friendOfFriend.id).catch(err => this.handleNotExistent(err))
if (validFOF.name != friendOfFriend.name) {
this.handleInvalidRequest()
}
else {
return validFOF
}
}
}
}


我如何重写它,以便它按顺序运行(您需要先找到 validFriend,然后才能查找他们的 friendOfFriend,但所有映射的项目都同时运行?

最佳答案

你有两个问题:

  1. 要解包的嵌套结构
  2. 如何等待多个 promise

如果您可以使代码独立并可在 TypeScript Playground 上运行(显然,您必须将其作为真实事物的简化版本),那将是理想的选择,因为这样会更容易展示你展开它。

但在精神上,我会采取的第一种方法是:

async function validate(userId): Promise<User> {
...
let friends = await findFriendsAndTheirFriends(userId)
return Promise.all(friends.map(validateFriend))
}

第一个函数 findFriendsAndTheirFriends()(当然,您必须编写它)获取给定的用户 ID 并返回 friend 列表和他们的 friend 。第二个函数获取每个 friend userId 并返回一个将验证该 friend 的 promise 。

但我不认为你拥有恰好两个级别的 friend 的方式是好的。除了难以阅读之外,它非常不灵活,几乎无法调试。

最好将其转化为某种图形问题,在其中搜索以 < 3 的距离连接到您的节点(您的用户)的所有节点(用户 ID)。

这种方法的美妙之处在于它仍然可以与上面的代码一起使用,只是 findFriendsAndTheirFriends() 函数会在幕后进行图形搜索。

关于javascript - 如何在嵌套映射函数中进行并发异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827967/

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