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