вернуть будущее из onComplete scala

Упражнение forComprehension не компилируется, так как возвращает Unit вместо Future[User]

(задача прочитать с помощью DAO и создать нового пользователя с помощью 2-х родителей)

Я пытаюсь вернуть Future[User] из onComplete, но терпит неудачу (возвращает Unit).

def unbornUsingForComp(fatherId: String, motherId: String): Future[User] = {

  val fatherUser: Future[Option[User]] = usersDao.read(fatherId)
  val motherUser: Future[Option[User]] = usersDao.read(motherId)

  val combinedLastName = for {
    r1 <- fatherUser
    r2 <- motherUser
  } yield (r1, r2)

  combinedLastName.onComplete {
    case Success(x) => {
      (x._1, x._2) match {
        case (Some(u1), Some(u2)) => usersDao.create(User("JustRandomId", "JustRandomFirstName", u1.lastName + " - " +u2.lastName))
        case _ => throw new Exception("One or more of the parents not Found")
      }
    }
    case Failure(_) => {
      throw new Exception("Exception raised inside the for comp.")
    }
  }
}

person ALjazzguitar    schedule 18.06.2020    source источник


Ответы (1)


onComplete по дизайну возвращает Unit, который выполняет побочный эффект, а затем отбрасывает

// Note that the returned value of `f` will be discarded.
def onComplete[U](f: Try[T] => U)(implicit executor: ExecutionContext): Unit

Вы, вероятно, после чего-то вроде

combinedLastName
  .map { x => // do stuff with x }
  .recover { case e => // handle exception }
person Mario Galic    schedule 18.06.2020
comment
Future[Future[User]] обычно решается с использованием flatMap вместо map. Другими словами, если функция, которую вы предоставляете map, возвращает Future, вместо этого вы обычно хотите flatMap. - person Suma; 18.06.2020