Scala中是否有成功和失败关闭的替代模式?
这个约定与node.js库通常做的类似,但是我只是想知道在Scala中是否有另一种方法可以做到这一点。
例如:
def performAsyncAction(n: BigInt,
success: (BigInt) => Unit,
failure: FunctionTypes.Failure): Unit = {
然后调用函数
performAsyncAction(10,
{(x: BigInt) =>
/* Code... */
},
{(t: Throwable) =>
e.printStackTrace()
})
由于
答案 0 :(得分:8)
听起来你想要Future
。请参阅AKKA实施here。
Future
是一个函数结构,它允许您指定要异步执行的代码块,然后您可以在结果完成后获取结果:
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"
但最好的部分是Future
是Monads,因此您可以使用map
和flatMap
之类的内容创建异步操作的管道:
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-comprehensions中使用它们:
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"