我对Scala很陌生,正在玩Futures。我有一小段代码,它与我在教程中找到的版本略有不同。
object Tmp extends App {
val f = Future {
val r = Random.nextInt(500)
if (r < 499)
throw new RuntimeException("bad value")
r
}
f.onComplete(ff => {
if (ff.isSuccess) {
println(s"success ${ff.get}")
}
})
f.failed.foreach(t => s"failure ${t.getMessage}")
// do the rest of your work
println("A ..."); Thread.sleep(100)
println("B ..."); Thread.sleep(100)
println("C ..."); Thread.sleep(100)
println("D ..."); Thread.sleep(100)
println("E ..."); Thread.sleep(100)
println("F ..."); Thread.sleep(100)
Thread.sleep(1000)
}
每次我运行这个,输出都是:
A ...
B ...
C ...
D ...
E ...
F ...
我既没有看到代码执行的成功/失败部分
抛出失败,但你用if (ff.isSuccess)
忽略它。以下是您应该如何处理onComplete
:
import scala.concurrent.Future
import scala.util.{Failure, Success}
import scala.util.Random
import scala.concurrent.ExecutionContext.Implicits.global
object Tmp extends App {
val f = Future {
val r = Random.nextInt(500)
if (r < 499)
throw new RuntimeException("bad value")
r
}
f onComplete {
case Success(value) => value
case Failure(e) => e.printStackTrace
}
// do the rest of your work
println("A ..."); Thread.sleep(100)
println("B ..."); Thread.sleep(100)
println("C ..."); Thread.sleep(100)
println("D ..."); Thread.sleep(100)
println("E ..."); Thread.sleep(100)
println("F ..."); Thread.sleep(100)
Thread.sleep(1000)
}
您的代码会引发异常,因为:
if (r < 499)
throw new RuntimeException("bad value")
您从行中看不到任何内容的原因
f.failed.foreach(t => s"failure ${t.getMessage}")
是因为您只创建字符串,但不对它执行任何操作。试试这个:
object Tmp extends App {
val f = Future {
val r = Random.nextInt(500)
if (r < 499)
throw new RuntimeException("bad value")
r
}
f.onComplete(ff => {
if (ff.isSuccess) {
println(s"success ${ff.get}")
}
else{ //added this
println(s"failes ${ff.get}")
}
})
f.failed.foreach(t => println(s"failure ${t.getMessage}"))//and added this
// do the rest of your work
println("A ..."); Thread.sleep(100)
println("B ..."); Thread.sleep(100)
println("C ..."); Thread.sleep(100)
println("D ..."); Thread.sleep(100)
println("E ..."); Thread.sleep(100)
println("F ..."); Thread.sleep(100)
Thread.sleep(1000)
}