使scala-future等待修改变量



我收到了一篇关于如何在列表缓冲区恰好在循环中调用的scala future中构建的情况下获得字符串列表缓冲区的文章。

这是一个亲吻的例子

def INeedThatListBuffer(): ListBuffer[String] = {
var myCollections: ListBuffer[String] = new ListBuffer[String]()
for (day <- daysInaWeek) {
val myFuture: Future[String] = Future {
// use 'day' do some stuff and get me a result
???
}
myFuture.onComplete {
case Success(result) =>
myCollections += result
}
}
myCollections
}

我的问题是,有时listBuffer是空列表,有时是我期望的内容。显然,在评估未来之前,这种方法是完整的。

只是为了添加

  1. 我不想使用future.await
  2. 将myCollections作为Future obj传递是不起作用的,因为在评估myCollections之前,没有myFuture必须完成的绑定

请帮帮我。

感谢

这将返回一个future。如果您不关心等待它完成,您可以始终使用.value:访问底层值

def INeedThatListBuffer(): Future[ListBuffer[String]] = {
def buildFutureFromDay(day: String): Future[String] = Future { ??? }
Future
.sequence(daysInAWeek.map(buildFutureFromDay))
.map(_.foldLeft(ListBuffer[String]())(_ += _))
}  

您需要在某个时刻await。要解决每个期货的await,或者稍后在整个缓冲区上将ListBuffer[String]更改为ListBuffer[Future[String]]await

val myFutureCollection: ListBuffer[Future[String]] = new ListBuffer[Future[String]]()
val myFuture: Future[String] = Future(???)
myFutureCollection += myFuture
val eventualBuffer: Future[ListBuffer[String]] = Future.sequence(myFutureCollection)
val buffer: ListBuffer[String] = Await.result(eventualBuffer, 2 seconds)

p.S:列表缓冲区可以使用val而不是var,因为它已经是可变的。

最新更新