Поэтому я попытался заставить небольшое игровое приложение общаться с другой службой отдыха. Идея состоит в том, чтобы получить запрос на стороне воспроизведения, а затем сделать запрос к остальным API и передать части результата другому локальному участнику, прежде чем отображать ответ от локального участника и остального сервиса в браузере. На этом изображении показано, как
И я попытался сделать это с потоками. У меня все работает, но я абсолютно не доволен той частью, где я разговариваю с моим локальным актером и создаю кортеж Future[(Future[String],Future[String])
, поэтому я был бы рад, если бы вы могли указать мне направление, как сделать это элегантно и чистый способ.
Итак, вот мой код. Ввод представляет собой файл 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))
}