【发布时间】:2020-03-08 17:04:00
【问题描述】:
我有一个对象,它有一个嵌套的对象数组,它还有另一个嵌套的对象数组。我有一个异步函数来检查它们是否有效。我希望它同时运行,但我想等待所有的承诺返回。现在我有:
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,但是所有映射的项目都同时运行?
【问题讨论】:
-
现在,两个映射的 Promise 已经在并行运行。 1)
friends上的顶级Promise.all,以及 2)friendOfFriends上的嵌套Promise.all。并且您的其他条件也得到满足:“先找到validFriend,然后才能查找他们的friendOfFriend”。要记住的一件事是函数签名显示返回Promise<User>,但目前没有返回任何内容。 -
对不起,我排除了最后的return语句。所以所有的朋友都是同时验证的,而不是顺序验证?
-
@VikramKhemlani 是的,它正在同时运行。看起来这段代码没有任何问题。你可以把
!=变成!==。 -
这完全取决于您想要的最终输出。就目前而言,您最终会得到一个包含friends_of_friends 数组的数组,但没有尝试过滤掉任一级别的无效朋友。
-
返回一个 validated 朋友的数组是有意义的,每个朋友都有一个包含 validated 朋友数组的属性(即每个朋友的经过验证的朋友)。如果这是您想要的,那么您需要为每个地图做两件事(1)如果有效则返回
friend,如果无效(不要抛出)则返回错误(例如null),然后(2)过滤映射数组以清除空值,只留下有效的朋友。您还需要将每个朋友的经过验证的朋友附加为原始朋友的属性。
标签: javascript typescript promise async-await