处理嵌套期货的最佳方法是什么?

时间:2019-06-25 14:35:03

标签: fluent vapor

我的系统中有用户和组。用户使用同级关系属于组。我需要将用户/组转换为用户/组的数组以返回到客户端。当我查找用户时,我会得到一个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的好方法。

1 个答案:

答案 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)
                }
            }

这似乎行得通,这是希望。并且坚持下去。

谢谢