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'。快樂的黑客攻擊。 –