让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 被评估之前就完成了。
刚刚添加
- 我不想用future.await
- 将 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
用于列表缓冲区,因为它已经是可变的。
我对如何在列表缓冲区恰好是在循环调用的 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 被评估之前就完成了。
刚刚添加
- 我不想用future.await
- 将 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
用于列表缓冲区,因为它已经是可变的。