2014-08-28 81 views
0

我必须从我的Scala Play框架应用程序调用外部REST服务。使用WS API我得到一个未来,并不确定哪个是从这个未来“提取”价值的最佳方式。这里是我的代码:玩框架 - 使用WS API

val externalRestServiceCall: Future[List[Data]] = WS.clientUrl(dataSourceProperties.url).get().map { 
    response => response.json.as[List[Data]] 
} 

,这是我目前的做法,虽然返回一个未来:

val timeoutFuture = play.api.libs.concurrent.Promise.timeout("Oops", 1 second) 
Future.firstCompletedOf(Seq(externalRestServiceCall, timeoutFuture)).map { 
    case first: List[Data] => Some(first) 
    case _ => None 
} 

回答

1

在我看来,最好不要想“提取”的未来。

如果您正在采取行动,只需使用Action.async(theWsFuture.map(wsRes => aPlayResult))即可。

你也可以混合“非未来”里面.async(...)这个未来的结果是:未来在Play: How to implement action composition

def myAction = Action async { 
    for { 
    a <- Future.successful(syncVal) 
    b <- myFuture 
    } yield Ok(somethingWithAB) 
} 

见行动组成。

+0

非常有用的回复,我遵循了你的建议,并用Action.async封装了我的动作。 – ardlema 2014-08-30 18:15:04