Play 2.2 -Scala - How to chain Futures in Controller Action

前端 未结 2 1591
不知归路
不知归路 2021-02-06 12:51

I have 3 futures of type Response. The first future returns a JsValue which defines if future 2 and future 3 shall be executed or only future 3 shall be executed.

Pseudo

2条回答
  •  盖世英雄少女心
    2021-02-06 13:47

    I found this solution but I dont think that it is a good solution because Iam using Await.result() which is a blocking operation. If anyone knows how to refactor this code without blocking operations please let me know.

    def addSuggestion(indexName: String, suggestion: String) = Action.async {
      val indexExistsQuery: IndexExistsQuery = new IndexExistsQuery(indexName);
      val addSuggestionQuery: AddSuggestionQuery = new AddSuggestionQuery(indexName, suggestion)
      val indexCreationQuery: CreateCompletionsFieldQuery = new CreateCompletionsFieldQuery(indexName)
    
      val indexExists: Boolean = indexExistsQuery.getBooleanResult(indexExistsQuery.getResult(Await.result(EsClient.execute(indexExistsQuery), 5.second)))
      if (indexExists) {
        EsClient.execute(addSuggestionQuery).map { response => Ok("Feed title: " + (response.json)) }
      } else {
        val futureResponse: Future[Response] = for {
          responseTwo <- EsClient.execute(indexCreationQuery)
          responseThree <- EsClient.execute(addSuggestionQuery)
        } yield responseThree
    
        futureResponse.map { response =>
          {
            Ok("Feed title: " + (response.json))
          }
        }.recover { case _ => Ok("bla") }
      }
    }
    

提交回复
热议问题