Scala 的未来理解

Scala Future for Comprehension

我有一个方法应该遍历 Future 和 return 一个 Tuple。这是:

  private def myMethod(id: Long): Future[(Double, Double)] = {
    val result = for {
      someValue <- run { getFromDb(id).headOption }
      value     <- someValue
    } yield {
      value.valueType match {
        case ValueType.TypeA => (1.0, 1.0)
        case ValueType.TypeB => (2.0, 2.0)
      }
    }
  }

这是我的 运行 方法:

  private def run[R](dbio: slick.dbio.DBIOAction[R, slick.dbio.NoStream, scala.Nothing]) = async {
    await(db.run(dbio))
  }

它使用 Scala 异步库来计时我对数据库的调用!

getFromDB 方法只是在做一个查询:

def getFromDb(myId: Long) {
  MyTableQuery.filter(_.id === myId)
}

它抱怨 myMethod return 是一个 Future[Nothing]。我在这里没有看到任何问题。关于什么可能不满足我正在寻找的 return 类型的任何线索?

这里有一个简化版本,它表现出同样的错误:

def method: Future[(Double, Double)] = {
  val result = for {
    someValue <- Future("a")
    value     <- Future("b")
  } yield {
    value match {
      case "a" => (1.0, 1.0)
      case "b" => (2.0, 2.0)
    }
  }
}

问题是您在 result 值中捕获 return 类型,因此该方法没有 return 类型。此简化函数的有效形式为以下之一:

def method: Future[(Double, Double)] = {
  val result = for {
    someValue <- Future("a")
    value     <- Future("b")
  } yield {
    value match {
      case "a" => (1.0, 1.0)
      case "b" => (2.0, 2.0)
    }
  }
  result
}

或者:

def method: Future[(Double, Double)] = {
  for {
    someValue <- Future("a")
    value     <- Future("b")
  } yield {
    value match {
      case "a" => (1.0, 1.0)
      case "b" => (2.0, 2.0)
    }
  }
}