Scala Future不可等待吗?

5
我将使用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不是可等待的吗?我该如何强制转换它?

2个回答

6

如果我修复您示例代码中的语法(通过将def的主体放入块中,并将future{ "network get request here" }替换为_ => Future{ "network get request here" }),则会进行编译并工作。问题在于代码的其它部分。


谢谢。我还在学习,看起来问题出在我为该方法指定的返回类型上(未包含在例子中),最后一行是 Await.result(...)。 - Jake O

1

对我来说可以。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接