вернуть будущее от onComplete scala - PullRequest
0 голосов
/ 18 июня 2020

Упражнение для 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.")
    }
  }
}

1 Ответ

1 голос
/ 18 июня 2020

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 }
...