【问题标题】:Scala Future not Awaitable?Scala 未来不可等待?
【发布时间】:2014-03-24 22:58:43
【问题描述】:

我正在尝试使用 scala Futures 从网络服务键/值存储中实现线程批量获取。

大概

import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

def bulkGet(keys: List[String])
  val listFut = keys.map( future{ "network get request here" } )
  val values = Future.sequence(listFut)

  Await.result(values, Duration(10, SECONDS))

给我一​​个编译错误

[info] Compiling 1 Scala source to .../target/scala-2.10/classes...
[error]  .... type mismatch;
[error]  found   : scala.concurrent.Future[List[String]]
[error]  required: scala.concurrent.Awaitable[scala.concurrent.Future[List[String]]]

[error]     Await.result(values, Duration(10, SECONDS))
                         ^

我做错了什么。
我正在关注文档:如何阻止结果
http://docs.scala-lang.org/overviews/core/futures.html

scala.concurrent.Future 不是按定义可等待的吗?我如何强制它成为?

【问题讨论】:

    标签: scala future


    【解决方案1】:

    如果我修复了示例代码中的语法(通过将def 的主体放入一个块中,并将future{ "network get request here" } 替换为_ => Future{ "network get request here" }),则可以编译并运行。问题出在代码的其他部分。

    【讨论】:

    • 谢谢。仍在学习中,似乎问题出在我为该方法指定的返回类型(未包含在示例中),最后一行 Await.result(...)
    【解决方案2】:

    为我工作。

    $ scala
    Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_65).
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
      import scala.concurrent.{Future, Await}
      import scala.concurrent.ExecutionContext.Implicits.global
      import scala.concurrent.duration.{Duration, SECONDS}
    
      def bulkGet(keys: List[String]) = {
        val listFut = keys.map(_ => Future("network get request here"))
        val values = Future.sequence(listFut)
        Await.result(values, Duration(10, SECONDS))
      }
    
    // Exiting paste mode, now interpreting.
    
    import scala.concurrent.{Future, Await}
    import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.duration.{Duration, SECONDS}
    bulkGet: (keys: List[String])List[String]
    
    scala> bulkGet(List("foo", "bar", "baz"))
    res0: List[String] = List(network get request here, network get request here, network get request here)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2020-08-11
      • 2016-04-20
      • 2019-10-08
      • 1970-01-01
      • 2017-06-29
      • 2021-03-26
      相关资源
      最近更新 更多