2

ここで例を見ました:

val fut = Future { ... // my body function } // my body function がここから始まる
fut onComplete { ... // 私のコールバック }

本体関数の完了にコールバックを追加できるようです。まだ呼び出されていますか?とにかく、関数の実行を開始するに、未来にコールバックを追加したいと思います。それは理にかなっていますか?どうやってやるの ?

4

3 に答える 3

7

ドキュメントはあなたの最初のポイントについてかなり明確です:

コールバックの登録時にフューチャーがすでに完了している場合、コールバックは非同期で実行されるか、同じスレッドで順次実行されます。

後者の懸念については、将来の本文の最初の行として実行する必要があるコードを配置できます。たとえば、次のようになります。

def futureWithBefore[T](body: => T, before: => Any) = future {
  before()
  body()
} 
于 2013-05-14T17:46:39.970 に答える
1

または次のようなもの:

$ 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

はい、入力するのに少し時間が必要です。

于 2013-05-14T19:56:53.150 に答える