1

我真的很喜欢 Scala 2.10 中的新FutureAPI,我正在尝试将它用于一个简单的脚本。该程序的要点如下:

  1. 对某个 URL 的 HTTP 请求
  2. 根据响应需要用户输入
  3. 进一步处理

这个想法是将所有内容实现为期货链(平面图等),但这是我的问题:

我目前正在 SBT 中进行测试,所以当主线程完成时,SBT 会回到它的 REPL。同时,我的Future计算仍在等待我的用户输入。一旦我开始尝试输入,似乎readLine第 2 步中的调用正在与 SBT 尝试执行的任何输入作斗争。

例如,如果我的预期输入是abcdefghijklmnop,我的程序会收到它的一个随机子集,比如adghip,然后当它完成时,SBT 会告诉我这bcefjklmno不是命令。

我怎么也能...

  1. 延迟主线程在 Futures 的守护线程之前完成
  2. 替换readLine为不会与 SBT 冲突的其他呼叫
4

1 回答 1

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)
  }
}
于 2012-12-16T00:48:09.547 回答