如何在Scala中为Future添加回调?

如何在Scala中为Future添加回调?,scala,concurrency,future,Scala,Concurrency,Future,我看到一个例子: val fut=Future{…//我的身体功能}//我的身体功能从这里开始 fut onComplete{…//my callback} 看起来我可以在我的body函数完成后添加回调。它仍然被调用吗?无论如何,我更愿意在函数开始运行之前向未来添加回调。这有意义吗?我该怎么做呢?医生非常清楚你的第一点: 如果未来在注册时已完成 回调,则回调可以异步执行,或者 在同一线程上按顺序执行 对于后一个问题,您可以将需要运行的代码作为未来正文的第一行,例如: def futureWith

我看到一个例子:

val fut=Future{…//我的身体功能}//我的身体功能从这里开始 fut onComplete{…//my callback}
看起来我可以在我的body函数完成后添加回调。它仍然被调用吗?无论如何,我更愿意在函数开始运行之前向未来添加回调。这有意义吗?我该怎么做呢?

医生非常清楚你的第一点:

如果未来在注册时已完成 回调,则回调可以异步执行,或者 在同一线程上按顺序执行

对于后一个问题,您可以将需要运行的代码作为未来正文的第一行,例如:

def futureWithBefore[T](body: => T, before: => Any) = future {
  before()
  body()
} 

如果你想控制未来的执行点,你可以用
承诺
将其链接起来

import scala.concurrent._
import ExecutionContext.Implicits.global

val initialPromise = promise[Unit]

// add your computations
val fut = initialPromise.future map { _ => println("My Future") }

// register callbacks
fut onComplete { _ => println("My Callback") }

// run
initialPromise.success()
使用非
单位的东西
可以为计算提供任意值。

或类似的东西:

$ skala
Welcome to Scala version 2.11.0-20130423-194141-5ec9dbd6a9 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_06).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :pa
// Entering paste mode (ctrl-D to finish)

import scala.concurrent._
import ExecutionContext.Implicits.global

// Exiting paste mode, now interpreting.

import scala.concurrent._
import ExecutionContext.Implicits.global

scala> val x = Future { Thread sleep 60000L ; 7 }
x: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@44b0c913

scala> def todo = println("Extra work before the job.")
todo: Unit

scala> def something(i: Int) = { todo ; i }
something: (i: Int)Int

scala> x map something
res0: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@2a5457ea

scala> def f(i: Int) = { println(s"Job $i"); i+1 }
f: (i: Int)Int

scala> .map (f)
res1: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@32bc46f4

scala> .value
res2: Option[scala.util.Try[Int]] = None

scala> Await result (res1, duration.Duration("60 seconds"))
Extra work before the job.
Job 7
res3: Int = 8

是的,我需要一分钟来输入。

这是正确的,但我看不出比om nom nom更简单的方法有什么优势。我错过了什么吗?这样组合,future和callback可以在不同的执行器上运行。承诺需要更多的新闻报道。(我完全错过了OP的问题。)我认为OP希望确保回调注册发生在执行future之前,而不是在future主体之前执行代码
$ skala
Welcome to Scala version 2.11.0-20130423-194141-5ec9dbd6a9 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_06).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :pa
// Entering paste mode (ctrl-D to finish)

import scala.concurrent._
import ExecutionContext.Implicits.global

// Exiting paste mode, now interpreting.

import scala.concurrent._
import ExecutionContext.Implicits.global

scala> val x = Future { Thread sleep 60000L ; 7 }
x: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@44b0c913

scala> def todo = println("Extra work before the job.")
todo: Unit

scala> def something(i: Int) = { todo ; i }
something: (i: Int)Int

scala> x map something
res0: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@2a5457ea

scala> def f(i: Int) = { println(s"Job $i"); i+1 }
f: (i: Int)Int

scala> .map (f)
res1: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@32bc46f4

scala> .value
res2: Option[scala.util.Try[Int]] = None

scala> Await result (res1, duration.Duration("60 seconds"))
Extra work before the job.
Job 7
res3: Int = 8