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)
}
}
}
我有一个方法应该遍历 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)
}
}
}