我的系统中有用户和组。用户使用同级关系属于组。我需要将用户/组转换为用户/组的数组以返回到客户端。当我查找用户时,我会得到一个Future,如果我随后映射了该用途并尝试访问其组,则会得到一个Future。
处理嵌套期货的最佳方法是什么,以便我可以获取实际数据并对其进行修改?
struct ReturnUserStruct {
var userId: Int
var primaryGroupName: String
}
let futureUsers = Users.query(on: request).all()
futureUsers.map { users in
var returnUsersArray<returnUserStruct> = []
users.ForEach { user in
var returnUserStruct: ReturnUserStruct
returnUserStruct.userId = user.id
// This a sibling relationship that returns a Future
primaryGroupFuture = user.primaryGroup
primaryGroupFuture.map { group in
returnUserStruct.primaryGroupName = group.name
}
returnUsersArray.append(returnUserStruct)
}
return returnUsersArray
此代码无效。该映射调用显然是异步调度的,并且returnUsersArray最终为空。我可以重新安排它,并将用户ID放入返回数组,但还没有找到获取groupName的好方法。
答案 0 :(得分:1)
很高兴听到Fluent4和Vapor4。这是我已经确定的解决方案。
return Users.query(on: request)
.all()
.and(Group.find(user.primaryGroup).first())
.map { (users, groupOptional) -> [ReturnUserStruct]
guard let group = groupOptional else {
Abort(.notFound)
}
var returnArray: Array<ReturnUserStruct>
users.forEach { user in
var returnUserStruct: ReturnUserStruct
returnUserStruct.userId = user.id
returnUserStruct.primaryGroupName = group.name
returnArray.append(returnUserStruct)
}
}
这似乎行得通,这是希望。并且坚持下去。
谢谢