2012-11-25 55 views
1

我真的很喜歡Scala 2.10中的新Future API,我正在嘗試將它用於簡單腳本。該方案的要點如下:Scala 2.10在SBT中使用readLine的期貨

  1. HTTP請求到一些URL
  2. 需要用戶輸入基於所述響應
  3. 進一步處理

的想法是實現一切作爲鏈期貨(平面圖等),但這裏是我的問題:

我目前正在做我的SBT測試,所以當主線程結束時,SBT回到它的REPL。同時,我的Future計算仍在等待我的用戶輸入。一旦我開始嘗試輸入,似乎第二步中的readLine調用與SBT試圖執行的任何輸入作鬥爭。例如,如果我的預期輸入是abcdefghijklmnop,我的程序會收到一個隨機子集,如adghip,然後當它結束時,SBT會告訴我bcefjklmno不是一個命令。

我怎麼能要麼...

  1. 延遲從期貨的守護線程之前完成主線程
  2. 一些其他呼叫不會與SBT
  3. 打替換 readLine
+1

Ahh,http://stackoverflow.com/questions/10565475/possible-bug-in-scala-2-10-future?rq=1可能會回答我的問題。要把這件事留下來,直到我因爲在搜尋中不好而感到不適。 – Dylan

回答

0

使用scala.concurrent.AwaitJavaDoc)。也許下面的草圖是你正在尋找的?

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext._ 
import scala.concurrent.duration.Duration 
import scala.concurrent.duration._ 
import scala.concurrent.Await 
import java.util.concurrent.Executors.newScheduledThreadPool 

object Test { 
    implicit val executor = fromExecutorService(newScheduledThreadPool(10)) 
    val timeout = 30 seconds 

    def main(args: Array[String]) { 
    val f = 
     // Make HTTP request, which yields a string (say); simulated here as follows 
     Future[String] { 
     Thread.sleep(1000) 
     "Response" 
     }. 
     // Read input 
     map { 
      response => 
      println("Please state your problem: ") 
      val ln = readLine() // Note: this is blocking. 
      (response, ln) 
     }. 
     // Futher processing 
     map { 
      case (response, input) => 
      println("Response: " + response + ", input: " + input) 
     } 
    Await.ready(f, timeout) 
    } 
} 
相關問題