2016-06-13 27 views
1

私はScalaでPlay 2.5を使用しています。私は、複数の外部Webサービスを呼び出すクラスを作成しました。複数のWebサービスを呼び出す

外部Webサービスが何らかの条件で呼び出され、okまたはnokの簡単な応答が得られます。それがOKならば、私は内部オブジェクトの状態を更新する必要があります。もしnokなら今は何もしません。

ここは私のクラスです。これは、パラメータリストとしてのStringのリストのリストを取り、コントローラで扱うオブジェクトのFutureリストを返します。

def callWSAndGetResponse(listOfList: List[List[String]]): Future[List[MyObject]] = { 

    val res = listOfList map { listOfIds => 
     listOfIds map { id => 
      val foundObj = allMyObject.find(obj => obj.id == id) 
      if(foundObj.isDefined) { 
       foundObj.get.urls map { url => 
        val futureReponse: Future[WSResponse] = ws.url(url).get() 

        futureResponse map { response => 
         (response.json \ "response").as[String] 
        } 
       } 
      } 
     } 

    } 

    // if responses are ok create a list of MyObject to return for example. 


} 

val resリストのタイプリストであるが、私はそれは、応答の単純なリストになりたいです。
1)回答の一覧を取得するためにコードを単純化して修正する方法。後でOKかどうかを確認しますか?

2)回答がうまくいかなかったかどうかを確認するにはどうすればよいですか?

答えて

0

このブロックがList[Future[Json]]を返すようにしてから、"List[Future] to Future[List] disregarding failed futures"などを使用できます。

val res = listOfList map { 
    _.map { id => 
     allMyObject 
      .find(obj => obj.id == id) 
      .map { 
       _.flatMap {url => 
        val futureReponse: Future[WSResponse] = ws.url(url).get() 
        futureResponse map { response => 
         (response.json \ "response").as[String] 
       } 
      } 
     } 
    } 
} 

ifブロックAnyValにではなく、(ここでは、あなたの問題が発生します)は、特定のタイプに割り当てます。これは、マップと(むしろisDefined/GETより)flatMapを使用する必要がありますを行うには

:マップを使用して

scala> if (true) 23 
23: AnyVal 

scala> if (false) 23 
(): AnyVal 

はオプションモナドであなたを保持します:

scala> (None: Option[Int]).map(_ * 2) 
None: Option[Int] 
関連する問題