让scala未来等待修改变量

make scala future wait to modify a variable

我对如何在列表缓冲区恰好是在循环调用的 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 是空列表,有时是我预期的内容。很明显,这个方法在 future 被评估之前就完成了。

刚刚添加

  1. 我不想用future.await
  2. 将 myCollections 作为 Future obj 传递不起作用,因为没有约束 myFuture 必须在计算 myCollections 之前完成。

请帮帮我。

谢谢

这个returns一个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 用于列表缓冲区,因为它已经是可变的。