【问题标题】:Scala function tries to return Unit instead of FutureScala 函数尝试返回 Unit 而不是 Future
【发布时间】:2017-10-31 00:19:44
【问题描述】:

我正在编写一个遵循以下工作流程的 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 的新手,我确信我遗漏了一些东西。如果有人可以指出会很酷。任何线索或帮助将不胜感激。

【问题讨论】:

    标签: scala playframework functional-programming


    【解决方案1】:

    您将结果分配给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 的调用,不会产生双重嵌套的未来。

    【讨论】:

    • 酷。我想知道,如果hotelRepository.getHotel(id) 函数失败或找不到id 的对象会怎样?
    • 鉴于其Future[Hotel] 的类型,它只有在不能产生Hotel 时才能真正抛出异常,这反过来又会产生失败的未来并跳过下一步。如果没有找到酒店并不是真正的错误,那么getHotel 方法的类型应该是Future[Option[Hotel]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多