为什么onComplete在Scala中的代码中等待Promise.success?

时间:2013-11-26 15:45:11

标签: scala

我正在阅读Scala中的Futures和Promises,并编写了以下代码:

def printSomething(): Future[String] = {
  val p = Promise[String]
  val sayHello = future {
    Thread.sleep(1000)
    p.success("hello")
  }
  p.future
}

def main(args: Array[String]) {
  val something: Future[String] = printSomething()
  something onComplete {
    case Success(p) => println(p)
  }
}

问题是onComplete回调没有print任何东西(除非我调试它)。

onComplete是否必须等待p.success("hello")中的printSomething

3 个答案:

答案 0 :(得分:6)

我的猜测是,这与您ExecutionContext的{​​{1}}有关,因此当main超过onComplete时就会终止。如果你在onComplete之后添加一个睡眠,你应该得到你想要的。稍微修改过的代码版本显示:

import concurrent._
import ExecutionContext.Implicits._

object PromTest {
  def printSomething(): Future[String] = {
    val p = Promise[String]
    val sayHello = future {
      Thread.sleep(1000)
      p.success("hello")
    }
    p.future
  }

  def main(args: Array[String]) {
    val something: Future[String] = printSomething()
    something onComplete {
      case result => println(result)
    }
    Thread.sleep(2000)
  }
}

答案 1 :(得分:2)

正如其他人所说,你的执行会在你的未来有机会运行之前终止。但是,我觉得添加硬编码的睡眠调用并不是最干净的解决方案,等待未来完成(超时,以防止代码卡住)是可取的:

Await.ready(something, Duration(2000, MILLISECONDS))

这将使something完成等待最多2000毫秒,否则将失败。

答案 2 :(得分:1)

您的应用在您的承诺完成之前退出。在主要方法的最后,只需添加Thread.sleep(2000)之类的内容,您就会看到结果。