[英]Running futures sequentially
以下代码的目的是根据条件执行Future f3
或f4
。 请注意,条件取决于Future f1
或f2
的结果,因此必须等待。 这似乎可行,但是由于f1
和f2
是期货,因此此代码不应顺序运行。 此代码正确吗?
object TestFutures extends App {
val f1 = Future { 1 }
val f2 = Future { 2 }
val f3 = Future { 3 }
val f4 = Future { 4 }
val y = 1
for {
condition <- if (y>0) f1 else f2
_ <- if (condition==1) f3.map {a => println("333")} else f4.map {b => println("444")}
} yield ()
Thread.sleep(5000)
}
不,这是不正确的。 当像您一样创建Future
时,它将立即开始计算。 到达之前for
理解,所有的4个期货已经运行。 您需要稍后根据条件创建它们。
val y = 1
for {
condition <- if (y > 0) Future { 1 } else Future { 2 }
_ <- if (condition == 1)
Future { 3 }.map(a => println("333"))
else
Future { 4 }.map(b => println("444"))
} yield ()
出于可读性考虑,最好将创建的每个方法提取到您将要调用的方法中。
很明显,它们在创建时就开始运行,因为您可以说
Future(1).map(x => println(x))
它的工作原理没有任何触发。 无论如何尝试运行以下代码
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def printWhenCompleted[A](f: Future[A]): Future[A] = f.map { x =>
println(x)
x
}
val f1 = printWhenCompleted(Future { 1 })
val f2 = printWhenCompleted(Future { 2 })
val f3 = printWhenCompleted(Future { 3 })
for {
r3 <- f3
r2 <- f2
r1 <- f1
} yield r1 + r2 + r3
它应该给你这些数字中随机顺序,而不是连续的3, 2, 1
这是使用flatMap
实现的第一个代码(不带println
)
val futureCondition = if (y > 0) Future(1) else Future(2)
futureCondition.flatMap(condition => if (condition == 1) Future(3) else Future(4))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.