【发布时间】:2015-11-20 14:08:08
【问题描述】:
我是 Scala 的初学者Futures/Promises。
我正在尝试使用Futures(使用回调)来做到这一点:
- 获取可用的 Git 存储库。
- 获取每个存储库的贡献者。
- 获取每个存储库的 README 文件。
- 最后为每个存储库创建一个 GitData 响应,其中包含存储库 URL、贡献者和自述文件。
代码如下:
// Final write container to hold the result.
val promise = Promise[List[GitData]]()
val repositoriesF = Future {
GitDriver.repositoriesOf(request.user)
}
val gitRepositories = Promise[List[GitRepository]]()
repositoriesF onSuccess {
case repositories => {
val contributors = Promise[List[Contributor]]()
val contributorsF = Future(repositories.map(GitDriver.contributors))
val readMe = Promise[List[String]]
val readMeF = Future(repositories.map(GitDriver.readme))
contributorsF.onSuccess {
case contrib => contributors.success(contrib.flatten)
}
readMeF.onSuccess {
case r => readMe.success(r)
}
val extractedContributors = contributors.future.value
val extractedReadme = readMe.future.value
println(extractedContributors.size)
println(extractedReadme.size)
}
}
Await.ready(repositoriesF, Duration.Inf)
贡献者和自述文件的大小始终为零。
我解决这个问题的方法是,我可以通过Futures 并行提取贡献者和自述文件,因为它们不相互依赖。他们所需要的只是一个存储库对象。
我在这里缺少什么?我确信有更优雅的解决方案用于理解、地图、dsls 等。但只是好奇地想深入了解这一点!谢谢。
【问题讨论】:
-
虽然方法可能听起来不错,但请记住 github has limitations on the amount of requests 您可以这样做(不是说这是问题的最初原因)
-
是的,明白这一点 - 但我肯定在配额之内。 :-)
标签: scala asynchronous concurrency promise future