Scala函数尝试返回Unit而不是Future

时间:2017-10-30 16:06:34

标签: scala playframework functional-programming

我正在编写一个遵循以下工作流程的scala函数:

  • 将id作为参数。
  • 使用id从mongo数据库中获取对象。我在这里使用反应性mongo。

  • 获取对象后再向数据库发出查询以获取项目列表并将其返回。

我已按以下方式实施此工作流程:

def functionA(id:String):Future[List[Hotel]]={
    var futureHotel = hotelRepository.getHotel(id) // returns Futue[Option[Hotel]]
    val result = for {
      r<-futureHotel
    }yield (hotelRepository.getHotels(r.get.giataid)) // this is supposed to be Future[List[Hotel]]
  }

它给出了如下错误消息:Type mismatch. Found Unit require Future[List[Hotel]]

因为我是Scala的新手,我相信我错过了一些东西。如果有人可以指出,那将会很酷。任何线索或帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

您要将结果分配给result。 scala中的赋值类型为Unit(不返回任何内容)。删除赋值,因为最后一个表达式成为返回值。

此外,如果getHotels方法返回Future[List[...]],您最终会以Future[Future[List[...]]结束。你可能想要这样的东西:

def functionA(id:String):Future[List[Hotel]]= {
  for {
    r <- hotelRepository.getHotel(id)
    result <- hotelRepository.getHotels(r.get.giataid)
  } yield result
}

这转化为对flatMap的调用,而这种调用不会产生双重嵌套的未来。

相关问题