2014-03-24 71 views
4

我正在嘗試使用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不會被定義爲Awaitable?我如何強制它呢?

回答

5

如果我修正了示例代碼中的語法(通過將def的主體放入塊中,並用_ => Future{ "network get request here" }替換future{ "network get request here" }),此編譯和工作。問題出在代碼的其他部分。

+0

謝謝。仍然在學習,看來問題出在我爲該方法指定的返回類型(未包含在示例中),最後一行Await.result(...) –

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)