2

Scalaで成功と失敗のクロージャーを持つための代替パターンはありますか?

node.js ライブラリが通常行うことと同様のこの規則に問題はありませんが、Scala でこれを行う別の方法があるかどうか疑問に思っています。

例えば:

def performAsyncAction(n: BigInt,
                success: (BigInt) => Unit,
                failure: FunctionTypes.Failure): Unit = {

次に、関数の呼び出し

performAsyncAction(10,
         {(x: BigInt) => 
              /* Code... */
         }, 
         {(t: Throwable) => 
              e.printStackTrace()
         })

ありがとう

4

1 に答える 1

8

が欲しいようですねFutureここで AKKA の実装を参照してください。

AFutureは、非同期に実行するコード ブロックを指定できる関数構造であり、完了したら結果を取得できます。

import akka.actor.ActorSystem
import akka.dispatch.Await
import akka.dispatch.Future
import akka.util.duration._

implicit val system = ActorSystem("FutureSystem")

val future = Future {
  1 + 1
}
val result = Await.result(future, 1 second)
println(result) //  prints "2"

メソッドで失敗時の動作を指定できますonFailure( と もonCompleteありonSuccessます):

val future = Future {
  throw new RuntimeException("error")
}.onFailure {
  case e: RuntimeException => println("Oops!  We failed with " + e)
}
//  will print "Oops!  We failed with java.lang.RuntimeException: error"

しかし、最良の部分はs がモナドであるため、や などFutureを使用して非同期アクションのパイプラインを作成できることです。mapflatMap

val f1 = Future { "hello" }
val f2 = f1.map(_ + " world")
val f3 = f2.map(_.length)
val result = Await.result(f3, 1 second)
println(result) //  prints "11"

または、それらを for 内包表記で使用します。

val f1 = Future { "hello" }
val f2 = Future { " " }
val f3 = Future { "world" }
val f4 =
  for (
    a <- f1;
    b <- f2;
    c <- f3
  ) yield {
    a + b + c
  }
val result = Await.result(f4, 1 second)
println(result) //  prints "hello world"
于 2012-08-07T05:15:21.627 に答える