抱歉,但是我是Scala的新手。我已经阅读了有关Futures和Akka的文章,但是仍然存在为我的方法返回字符串的问题。
我有一个方法getAuthString,它应该返回Authentication String(或Token)。我已经使用了喷雾Jsonsupport,并且可以打印结果
def getToken(url: String, username: String , password: String) = Future[String]{
import MyJsonProtocol._
import spray.httpx.SprayJsonSupport._
val pipeline: HttpRequest => Future[AuthTokenResult[Entry]] = (addCredentials(BasicHttpCredentials(username, password))
~> sendReceive
~> unmarshal[AuthTokenResult[Entry]]
)
val myfutureResponse: Future[AuthTokenResult[Entry]] = pipeline(Get(url))
myfutureResponse onComplete {
case Success(AuthTokenResult(Entry(Content(authString)):: _)) => println(authString)
case Failure(error) => println("An error has occured: " + error.getMessage)
}
这将解组json并打印所需的authString。但是,打印对我不利。我知道onComplete返回单位。我想返回authString,以便可以在其他请求的其他地方使用它。我想我将不得不使用平面地图或地图,但是我不确定如何使用。我需要我的方法返回authString或错误。
您不希望返回a String
,而是想返回Future[String]
a-一旦某件事是异步的,使其不异步的唯一方法是阻塞,这通常是浪费,使整个异步性变得毫无意义。
我不确定为什么要将两者都包装在一起Future
-微不足道的计算可能会自己发生,将它们强制到单独的线程上几乎没有什么价值。所以你想要像这样的东西:
def getToken(url: String, ...): Future[String] = {
...
val myFutureResponse: Future[AuthTokenResult[Entry]] = ...
myFutureResponse map {
case AuthTokenResult(Entry(Content(authString))::_) => authString
}
}
因此,您可以通过计算map
将aFuture
转换为另一个Future
。这将“穿越”的错误,但你可以使用像recover
或者recoverWith
,如果你要处理他们在一个特定的方式。
然后,当您要Future[String]
在喷涂路线中使用时,可以使用onSuccess
或onComplete
指令:
val myRoute = (path("/somewhere") & parameter("authData") {
authData =>
onSuccess(getToken(authData)) {
authToken =>
complete("Authed as " + authToken)
}
}
这将以Future
适当的异步,反应方式使用,而不会发生阻塞。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句