【发布时间】:2014-03-10 12:13:30
【问题描述】:
我有一个场景,其中我得到一个字符串消息列表,我必须遍历字符串并调用另一个方法,这是一个长时间运行的过程。然后,我必须收集这个长时间运行的过程的结果并将结果连接起来并将其发送回用户界面。我对 Scala 中的这些 Future 概念很陌生。我正在使用 Play 框架,其中字符串列表将来自用户界面。这是我第一次尝试实现 ht 场景的样子:
def futuresTest(strList: List[String]) = Action {
Async {
val ftrList: List[Future[String]] =
strList.map(s => Akka.future {longRunningCall(s)} ).toList
val futureResultList = Future.sequence(ftrList)
val jsonResponse: String =
futureResultList.map(_.sum).asInstanceOf[String]
Akka.future { Ok(jsonResponse) }
}
}
为简单起见,longRunningCall 只返回一个字符串。稍后我会将它与原始实现联系起来。
def longRunningCall(s: String) = "test"
我的问题是在声明中:
val ftrList: List[Future[String]] =
strList.map(s => Akka.future {longRunningCall(s)} ).toList
我会假设 ftrList 将被异步填充,当它到达下一行时,我保证 futureResultList 将包含所有元素(即 strList 和 futureResultList 的大小将相等?
val futureResultList = Future.sequence(ftrList)
请指教!
【问题讨论】:
-
当你在
List上调用.map时,它会返回一个List...你不需要在结果上调用.toList。 -
我也很惊讶地看到
.sum处理List[String]和Future被直接转换为String显然没有问题。 -
这是一个错误。总和是我的错误。然而,IntelliJ 并没有对此有任何抱怨!
-
我是否正确假设 sum 应该在这里连接字符串?
标签: scala playframework akka future