【问题标题】:scala returning a Future[Option[user]]scala 返回一个 Future[Option[user]]
【发布时间】:2016-08-01 20:38:12
【问题描述】:

所以,我是 Scala 的新手,来自 Java 背景,并且有大量的 scala 代码库可供学习。而且,我很迷茫,不胜感激。

我想重新安排以下功能。目前,该函数连续调用两个函数,然后返回结果。第一个函数返回一个布尔值,第二个函数返回一个用户。然而,实际上应该发生的是,只有在第一个函数返回 true 时才应该调用第二个函数。所以,在继续之前,我需要重新排列它以检查第一个函数的返回值。每次我重写它来执行此操作时,我都会收到编译错误或异常。它应该返回一个 Future[Option[User]] 并且第一个函数不返回一个用户。如果 FunctionA 失败,我只想返回 None,但因为它需要 Future[Option[X]]],所以很不高兴。所以,下面是函数:

private def profileForCredentials(userId: String, password: String)(implicit ec: ExecutionContext): Future[Option[User]] =
  {
      val credentials: Throwable \/ Boolean = {
      try {
         FunctionA(userId, password).right[Throwable]
      }
      catch {
        case npe: NullPointerException =>
          npe.left[Boolean]
      }
    }

    //This function doesn't need to be called unless credentials=true
    FunctionB(id, userId).map {
        case maybeUser@Some(user) =>
          credentials match {
            case \/-(x) if x =>
              user.some
            case _ =>
              None
          }
        case None =>
          None
      }
}

【问题讨论】:

  • Future 在哪里?
  • 尝试返回 Future { None } 而不是 None
  • @Jean Logeart FunctionB 可能会返回 Future。
  • 我们需要FunctionAFunctionB的返回类型来帮助你

标签: scala


【解决方案1】:

你们刚刚被 scalaz 冲昏了头脑。 我打算将此页面添加为书签,以向工作中的人们展示为什么我们不应该使用所有这些花哨的东西。

这样做:

    Try { 
       FunctionA(userId, password)
    }
    .toOption
    .collect { case(true) => 
      FunctionB(id, userId)
    }
    .getOrElse(Future.value(None))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多