我正在使用 Scala 2.10、Akka 2.1 和 Play 2.1。当我向我的后端发送一个 http 请求时,我ask
需要一个演员来计算一些东西。这个想法是如果它在超时之前返回,则返回计算结果,否则返回不同的字符串。请参阅下面的代码。
val futureInt: Future[Int] = ask(testActor, Calculate(number.toInt)).mapTo[Int]
val timeoutFuture = play.api.libs.concurrent.Promise.timeout("Oops", 2.seconds)
Async {
Future.firstCompletedOf(Seq(futureInt, timeoutFuture)).map {
case i: Int => Ok("Got result " + i)
case t: String => Ok("timeout expired")
}
}
演员如下:
class TestActor() extends Actor {
def receive = {
case Calculate(tonumber: Int) =>
for (a <- 1 to tonumber) {
val c: Double = scala.math.pow(a, 2)
println("a: " + a + ", c: " + c)
}
12345 // hardcoded value to return when the calculation finishes
case _ =>
println("bah")
}
}
我的问题是,即使演员在超时之前完成,Future 也不会“返回”任何内容,因此超时总是会过期。我究竟做错了什么?非常感谢。