Web services 如何使用scala在play框架中的for循环中进行web服务调用

Web services 如何使用scala在play框架中的for循环中进行web服务调用,web-services,rest,asynchronous,playframework,Web Services,Rest,Asynchronous,Playframework,我是新手。我想使用它对web服务进行RESTAPI调用,以获取系统中所有用户的信息。有两个步骤: 1.获取所有用户的ID 2.获取每个用户的信息 使用for compression,我可以用以下方式编写2请求: for { uids <- getUids() users <- getUsers(uids) } yield Ok(s"${users.size} users(s), ${users}") getUids很简单,但在getUsers中,我不能一次性发送RESTAP

我是新手。我想使用它对web服务进行RESTAPI调用,以获取系统中所有用户的信息。有两个步骤: 1.获取所有用户的ID 2.获取每个用户的信息

使用for compression,我可以用以下方式编写2请求:

for {
  uids <- getUids()
  users <- getUsers(uids)
} yield Ok(s"${users.size} users(s), ${users}")
getUids很简单,但在getUsers中,我不能一次性发送RESTAPI中的所有用户ID。我一次最多可以发送100个用户ID,这意味着我需要一个for循环来成批进行大小为100的连续调用。但是所有这些WS-Request都是异步的,我怎么知道所有的请求何时完成,我怎么能将响应与最终结果结合起来并返回呢


谢谢

我不确定这是否可以编译,但请尝试以下方法:

for {
  uids <- getUids()
  users <- users <- Future.sequence(uids.grouped(100).toList.map(listOf100Ids => getUsers(listOf100Ids))).map(_.flatten)
} yield Ok(s"${users.size} users(s), ${users}")
步骤2-使用用户ID获取实际用户:

.toList.map(listOf100Ids => getUsers(listOf100Ids)) // Result is now something like List(List(Future[User]), List(Future[User]))
步骤3-从列表[列表[未来[用户]]]转到未来[列表[列表[用户]]]

Future.sequence(listOfFutureUsers)
步骤4-从未来[列表[用户]]]转到未来[列表[用户]]

futureListOfListOfUsers.map(_.flatten)
Future.sequence不按顺序执行期货。将它们有效地分组在这里没有任何作用,它们仍然会立即全部发射。
futureListOfListOfUsers.map(_.flatten)