我是异步编程的新手.我读了这个教程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并把setCookie和complete行动里面,但返回类型是不可接受的喷雾.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)
还有onFailure和onComplete(您必须匹配Success和Failure)查看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)
| 归档时间: |
|
| 查看次数: |
3519 次 |
| 最近记录: |