用异步结果响应的模式

时间:2016-02-08 17:29:05

标签: scala playframework playframework-2.0

我想让以下示例正常工作:

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的背景,我正在努力弄清楚这些回调应该如何工作,同时返回结果以安抚方法签名。

1 个答案:

答案 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 Futurethe docs for Action