Scala Future 回调似乎没有做任何事情



我对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)
}

最新更新