Каков наилучший способ обработки вложенных фьючерсов? - PullRequest
1 голос
/ 25 июня 2019

У меня есть пользователи и группы в моей системе.Пользователи принадлежат к группам, использующим родственные связи.Мне нужно преобразовать пользователей / группы в массив пользователей / групп, чтобы вернуться к клиенту.Когда я ищу пользователя, я получаю 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 заканчивается пустым.Я могу изменить это и получить идентификаторы пользователя в массиве возврата, но не нашел хорошего способа получить groupName.

1 Ответ

1 голос
/ 26 июня 2019

Приятно слышать о 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)
                }
            }

Кажется, это работает, вот надежда. И остается вокруг.

Спасибо

...