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

为什么';在Scala中的代码中,t onComplete等待Promise.success?,scala,Scala,我正在阅读Scala中的期货和承诺,并编写了以下代码: 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] =

我正在阅读Scala中的期货和承诺,并编写了以下代码:

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
回调不会
打印任何内容(除非我调试它)


onComplete
难道不需要等待
printSomething
中的
p.success(“hello”)
吗?

您的应用程序在您的承诺完成之前退出。在main方法的末尾,只需添加类似于
Thread.sleep(2000)
的内容,您就会看到结果。

我猜这与您所处的
执行上下文有关,因此当
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)
  }
}

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

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

这将最多等待2000毫秒,等待
某个东西完成,否则将失败。

我必须编写
val sayHello=Future{…}
才能编译它。