我想让以下示例正常工作:
def asyncTest = Action {
val willBeInt = Future {
Thread.sleep(5000)
100
}
willBeInt.onComplete({
case Success(value) => Ok(s"Value = $value")
case Failure(e) => Failure(e)
})
}
但是我收到一个关于重载方法的错误:
Overloaded method value [apply] cannot be applied to (Unit)
我来自NodeJS的背景,我正在努力弄清楚这些回调应该如何工作,同时返回结果以安抚方法签名。
答案 0 :(得分:4)
将Action
视为一个返回promise的函数,而不是一个接受回调的函数。在scala术语中,您将返回Future
。 Play的内部人员将自己调用onComplete
(或类似的东西)(与javascript Promise' then
函数类似)。
具体来说,您的编译错误是由于onComplete
返回Unit
,而Action
块希望您返回Future
。您可以使用map
将您的willBeInt
未来转变为Play正在寻找的内容:
def asynTest = Action.async {
val willBeInt = Future {
Thread.sleep(5000)
100
}
// note you will probably need to
// import scala.concurrent.ExecutionContext.Implicits.global
// to be able to call `map` here
willBeInt map { value =>
Ok(s"Value = $value")
} recover {
case e: Throwable => InternalServerError(e.toString)
}
}
如需额外阅读,请查看the docs for Future
和the docs for Action