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

时间:2014-11-03 03:23:15

标签: web-services rest asynchronous playframework

我是玩框架的新手。我想用它来对Web服务进行REST API调用,以获取系统中所有用户的信息。有两个步骤: 1.获取所有用户的ID 2.获取每个用户的信息

使用for-comprehesion,我可以用这种方式写出2个请求:

for {
  uids <- getUids()
  users <- getUsers(uids)
} yield Ok(s"${users.size} users(s), ${users}")

getUids()很简单,但是在getUsers()中,我无法在REST API中发送一次所有用户ID。我一次最多可以发送100个用户ID,这意味着我需要一个for循环来批量生成100个连续的调用。但是所有这些WS请求都是异步的,我怎么知道所有的请求都完成了我可以将响应与最终结果相结合并返回。

由于

1 个答案:

答案 0 :(得分:0)

我不确定这是否会编译,但尝试这样的事情:

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}")

Step1 - 将用户ID分成100个块:

uids.grouped(100).toList // Get something like List(List(1,2,3), List(4,5,6))

步骤2 - 使用用户ID获取实际用户:

.toList.map(listOf100Ids => getUsers(listOf100Ids)) // Result is now something like List(List(Future[User]), List(Future[User]))

Step3 - 从列表[列出[未来[用户]]]到未来[列表[列表[用户]]]

Future.sequence(listOfFutureUsers)

Step4 - 从Future [List [List [User]]]转到Future [List [User]]

futureListOfListOfUsers.map(_.flatten)