在喷涂路由中使用Future

win*_*ler 5 scala akka spray

我是异步编程的新手.我读了这个教程http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html,我很惊讶我是多么的轻松可以将Future纳入该计划.但是,当我使用Future with Routing时,返回类型有点错误.

get {
  optionalCookie("commToken") {
    case Some(commCookie) =>
      val response = (MTurkerProgressActor ? Register).mapTo[..].map({...})
      val result = Await.result(response, 5 seconds)

      setCookie(HttpCookie("commToken", content = result._2.mturker.get.commToken)) {
        complete(result._1, result._2.mturker.get)
      }

    case None => // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我真的不想使用Await(如果我只是阻塞线程并等待5秒钟,那么异步的重点是什么?).我试图用for-comprehension或flatMap并把setCookiecomplete行动里面,但返回类型是不可接受的喷雾.For-comprehension返回"Unit",并flatMap返回Future.

由于我需要设置这个cookie,我需要里面的数据.是Await解决方案吗?还是有一种简单的方式?

Mar*_*mou 15

您可以使用该onSuccess指令:

get {
    optionalCookie("commToken") { cookie =>
      //....
      val response = (MTurkerProgressActor ? Register).mapTo[..].map({...})
      onSuccess(response) {
        case (result, mTurkerResponse) =>
          setCookie(HttpCookie("commToken", content = mTurkerResponse.mturker.get.commToken)) {
            complete(result, mturkerResponse.mturker.get)
          }
      }
    }
Run Code Online (Sandbox Code Playgroud)

还有onFailureonComplete(您必须匹配SuccessFailure)查看http://spray.io/documentation/1.2.1/spray-routing/future-directives/onComplete/

此外,而不是get直接使用它更加惯用map(我假设mturker是一个Option或类似的东西):

case (result, mTurkerResponse) =>
  mTurkerResponse.mturker.map { mt =>
    setCookie(HttpCookie("commToken", content = mt.commToken)) {
      complete(result, mt)
    }
  }
Run Code Online (Sandbox Code Playgroud)