0
所以我试图让一个小型游戏应用程序与另一个休息服务进行通信。 这个想法是,在玩家端接收请求,然后向其他api发出请求并将结果的一部分提供给另一个本地actor,然后显示来自本地actor和其他服务在浏览器中的响应。 This image shows how使用play和akka-https:如何正确链接多个请求到传入的请求以创建响应?
而我试图用流做到这一点。我已经掌握了所有的工作,但是我对与我的当地演员谈话并创建一个元组的部分感到绝不满意,所以如果能够指出我的方向,我会很高兴,如何以优雅的方式做到这一点。干净的方式。
所以这里是我的代码。输入是一个csv文件。 我的本地演员创建了一个我想放入响应的附加图形。
def upload = Action.async(parse.multipartFormData) { request =>
request.body.file("input").map { inputCsv =>
//csv to list of strings
val inputList: List[String] = convertFileToList(inputCsv)
//http request to rest service
val responseFuture: Future[HttpResponse] = httpRequest(inputList, "/path",4321 ,"0.0.0.0")
//pattern match response and ask local actor
val formattedResult = responseFuture.flatMap { response =>
response.status match {
case akka.http.scaladsl.model.StatusCodes.OK =>
val resultTeams = Unmarshal(response.entity).to[CustomResultCaseClass]
//the part I'd like to improve
val tupleFuture = resultTeams.map(result =>
(Future(result.teams.reduce(_ + "," + _)),
plotter.ask(PlotData(result.eval)).mapTo[ChartPath].flatMap(plotAnswer => Future(plotAnswer.path))))
tupleFuture.map(tuple => tuple._1.map(teams =>
p._2.map(chartPath => Ok(views.html.upload(teams))(chartPath))))).flatMap(a => a).flatMap(b => b)
}
}
formattedResult
}.getOrElse(Future(play.api.mvc.Results.BadRequest))
}
谢谢!这似乎是正确的工具。您是否总体上认为我实施它的方式是一种好方法,还是以另一种方式来实现? – rincewind
@rincewind不客气。一般来说你的实现看起来很好。只要注意过度使用期货,实例化就有一个重要的初始成本。例如,'result.teams'必须相当大才能保证Future只是一个'reduce'。快乐的黑客攻击。 –