2015-10-27 57 views
1

我正在對一個返回用戶連接列表的服務進行WS調用。收到回覆後,我在列表上和foreach上做了一個foreach我對另一個服務進行WS調用以獲取每個連接的更多詳細信息。從Scala中的多個WS調用中返回一個List foreach

目前我正在嘗試使用ListBuffer,但由於調用的異步性質,在收集詳細信息之前它將返回空。

我的代碼如下,它返回一個空List到我的控制器:

def getAllConnections(username: String) = { 
    connectionsConnector.getAllConnections(username).map { 
     connections => 
     val connectionsList: ListBuffer[ConnectionsResponse] = ListBuffer() 
     connections.map { 
      connection => 
      usersService.getUser(connection.connectionUsername).foreach { 
       case Some(user) => 
       val blah = ConnectionsResponse(user, connection) 
       connectionsList.+=(blah) 
      } 
     } 
     connectionsList.toList 
    } 
    } 

我如何能一個Future[List]回到我的控制器將是巨大的任何建議,謝謝。

回答

2
for { 
    connections <- connectionsConnector.getAllConnections(username) 
    usersWithConnection <- Future.traverse(connections){ c => userService.getUser(c.connectionUsername).map(u => (u,c)) } 
} yield usersWithConnection.collect{ case (Some(user), conn) => ConnectionsResponse(user, conn)} 

至少應該給你一些想法。我們可以在未來的環境中使用理解。 Future.traverse將把期貨列表變成列表的未來。需要隨用戶返回連接會增加額外的複雜性,但我們可以將單個未來映射到包含與用戶的連接。

0

使用一元的循環:

def getAllConnections(username: String) = connectionsConnector.getAllConnections(username) map { connections -> 
    for { 
     connection <- connections 
     user  <- usersService.getUser(connection.connectionUsername) 
    } 
    yield ConnectionsResponse(user, connection) 
} 

我猜你使用所以這可能需要進行調整的具體類型,但非常類似的東西上面應該解決您的問題。

外層地圖映射原始的未來,由於for comprehension的第一個生成器是一個列表,結果也將是一個列表。

相關問題