Scala理解的未来
我有一个方法,应该遍历未来并返回一个元组。这是:Scala理解的未来,scala,future,Scala,Future,我有一个方法,应该遍历未来并返回一个元组。这是: private def myMethod(id: Long): Future[(Double, Double)] = { val result = for { someValue <- run { getFromDb(id).headOption } value <- someValue } yield { value.valueType match {
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)
}
}
}
它使用Scala异步库来计时我对数据库的调用
getFromDB方法正在执行一个查询:
def getFromDb(myId: Long) {
MyTableQuery.filter(_.id === myId)
}
它抱怨myMethod返回一个未来[什么都没有]。我看这里没有任何问题。关于什么可能不满足我正在寻找的返回类型,有什么线索吗?这里有一个显示相同错误的简化版本:
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)
}
}
}
或:
def方法:未来[(双重,双重)]={
为了{
someValue(2.0,2.0)
}
}
}
这里有一个简化版本,显示了相同的故障:
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)
}
}
}
或:
def方法:未来[(双重,双重)]={
为了{
someValue(2.0,2.0)
}
}
}
异步{await(db.run(dbio))}与刚才的db.run(dbio)
不一样吗?是的,但这不是问题所在!当我有多个对数据库的调用时,我可以使用run方法将其计时为按顺序运行!理解。运行的返回类型是什么?因为您正在再次对返回值进行平面映射,这表明您有类似于Future[Future[T]]
的返回值,这似乎很奇怪。运行的返回类型是Future[R].,R
因此是从getFromDb
推断出来的,其定义也丢失了。请发布一个完整的代码段。async{await(db.run(dbio))}
是否与刚才的db.run(dbio)
相同?是的,但这不是问题所在!当我有多个对数据库的调用时,我可以使用run方法将其计时为按顺序运行!理解。运行的返回类型是什么?因为您正在再次对返回值进行平面映射,这表明您有类似于Future[Future[T]]
的返回值,这似乎很奇怪。运行的返回类型是Future[R].,R
因此是从getFromDb
推断出来的,其定义也丢失了。请发布一个完整的片段。我不能这么愚蠢。出于某种奇怪的原因,我的IntelliJ抱怨它看到了未来[什么都没有],突然它消失了,似乎返回了正确的元组类型!我注意到的另一件奇怪的事情是,如果我从我的方法中删除返回类型,我的IntelliJ会抱怨说,它看到的结果是未来[什么都没有]!所以我必须保持返回类型完整,它才能工作!“我的IntelliJ在抱怨”Scala中的想法错误检测不可靠。你需要检查它是否真的编译了。我不能这么傻。出于某种奇怪的原因,我的IntelliJ抱怨它看到了未来[什么都没有],突然它消失了,似乎返回了正确的元组类型!我注意到的另一件奇怪的事情是,如果我从我的方法中删除返回类型,我的IntelliJ会抱怨说,它看到的结果是未来[什么都没有]!所以我必须保持返回类型完整,它才能工作!“我的IntelliJ在抱怨”Scala中的想法错误检测不可靠。您需要检查它是否实际编译。
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)
}
}
}