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